UDEV可以以某种方式触发会话中登录用户的zenity吗?


0

我想要一个 zenity 当我附加一个特定的外部驱动器时,对话框弹出窗口询问我是否要运行备份。

不幸的是,我遇到了UDEV规则语法的问题。我有这个规则 /etc/udev/rules.d/test.rules

ACTION=="add", ATTRS{manufacturer}=="Western Digital", ATTRS{idVendor}=="1058", ATTRS{idProduct}=="1140", RUN+="/usr/local/bin/test.sh"

这是非常基本的,但是:

  1. 它被触发了十几次而不是一次。
  2. 它无法“说话”使用 zenity 什么时候 test.shsudo -Hu <username> zenity --warning --text="Just some random text for now." 因为udev隐藏在系统中,无法找到窗口管理器: Gtk-WARNING **:无法打开显示:
  3. 它不是非常适合编辑的,我希望有一些规则,我可以为某些分区键入LABEL,我想在其上触发某些脚本。

我希望看到UDEV规则的一般改进,因为除了关于它的许多问题和答案,在这里和其他地方,它们似乎彼此有点不同,并且大多数触发多次。

但最重要的是,无论如何,我可以从这里建立连接到我家中的脚本,这些脚本可以访问我的会话和我的屏幕之类的内容,以便 zenity 能行得通?

Answers:


0

你已经找到了答案。脚本(zenity)需要一个X Window Server来显示消息。该脚本从中运行 udev 并且没有附加显示器。你可以通过硬连线来解决这个问题 DISPLAY 脚本中的变量,即

DISPLAY=:0; export DISPLAY

这样做的缺点是,只有你是唯一的用户和/或事先知道显示器才有效。例如,如果系统上有多个用户,则显示可能是其他任何用户 :1:2, 等等。或者其他用户在他的屏幕上获得zenity消息。

更好的方法是拆分事件的检测以及与用户的交互或消息的显示。

为此,您可以创建一个脚本或程序,该脚本或程序在GUI会话中运行,并侦听来自守护程序或udev触发器脚本的触发器。

第三种可能是连接到 udisks-daemon 插入外部设备时询问信息。您可以尝试 udisks --monitor 要么 udisks --monitor-detail 为此,并在事件发生时解析输出。

似乎有一个 udisksctl 命令,使用稍微不同的语法执行相同的操作。也许它只是一个较新的版本 udisks 命令。

你也可以看一些像Gui这样的工具 GNOME磁盘 ,它也依赖于udev / udisks系统。

更新

多次调用通常来自各子系统的报告。您可以看到,当您将环境记录到某个日志文件中时 /usr/local/bin/test.sh 脚本

umask 077
mkdir -p /tmp/udevtest.d
env >>/tmp/udevtest.d/udevtest.log

当我插入USB记忆棒时,我收到以下报告

$ grep -e ACTION -e SUBSYSTEM /tmp/udevtest.d/udevtest.log
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_host
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_disk
ACTION=add
SUBSYSTEM=scsi_generic
ACTION=add
SUBSYSTEM=scsi_device
ACTION=add
SUBSYSTEM=bsg
ACTION=add
SUBSYSTEM=block
ACTION=add
SUBSYSTEM=block

你也可以添加 DEVTYPE 区分这两者 usb 要么 disk 报告。 因此,为了将报告减少到几个甚至只有一个呼叫,您必须更具体,并为您的udev规则文件添加其他条件,例如选择 SUBSYSTEM=scsi_disk 或任何适合您的设备的东西。


感谢您的回复和提及替代方案。你是对的, DISPLAY=:0 做了伎俩。这个答案是第2个问题,但正如子问题1预测的那样,我现在得到了我的答案 zenity 一次插入驱动器弹出大约30次。知道我怎么能说这个吗?我希望只使用分区名称作为参数来调用脚本。 (例如,脚本被称为3次,有3个分区。)我也试过了 udisks 因为它似乎很容易,但它只是坐在那里声称是监控,但没有报告我插入的任何内容。也许它没有正确实现Ubuntu。
Redsandro

udiskctl 确实监控事件。如果我不知道怎么做,我会进一步调查 udev 最初计划的规则。
Redsandro

@Redsandro请看更新的答案。
Olaf Dietsche

谢谢。这仍然是一个谜题,但我现在更了解情况。我接受了你的回答。
Redsandro

0

对于其他读这篇文章的人来说,我能够在Kali Linux 2016中使用我的脚本工作的唯一方法是:

#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.