运行根据 udev 规则显示 X 窗口的脚本

运行根据 udev 规则显示 X 窗口的脚本

我发现了几个问题http://unix.stackexchange.com& 在http://stackoverflow.com与 udev 规则的启动脚本相关。但我找不到执行的确切解决方案或特定答案重击脚本。

所以,我问这个(规范的)问题:如何通过 udev 规则运行/启动/执行 Bash 脚本?

我发现的另一件事编写 udev 规则是:

udev 不在任何活动终端上运行这些程序,并且不在 shell 上下文中执行它们。请确保您的程序被标记为可执行,如果它是 shell 脚本,请确保它以适当的 shebang 开头(例如 #!/bin/sh),并且不要期望任何标准输出出现在您的终端上。

因此,我想知道是否可能“如何运行bash脚本按照 udev 规则?”


这是执行 bash 脚本的简单示例。

我写过99-myrule.rules,其中/etc/udev/rules.d包含:

ACTION=="add", ATTR{idVendor}=="0781", ATTR{idProduct}=="5567", RUN+="/home/pandya/example.sh"

lsusb我从输出中找到了供应商和产品 ID :

$ lsusb | grep SanDisk
Bus 001 Device 066: ID 0781:5567 SanDisk Corp. Cruzer Blade

我想zenity --info在连接我的随身碟(上面列出的 SanDisk)时执行实验命令。

所以,我写了/home/pandya/example.sh(在 udev 规则中调用RUN+=)contians:

#!/bin/bash
zenity --info &
exit

但是这个脚本没有执行(尽管有执行权限)。我也尝试过以下操作:

  • export DISPLAY=:0在之前的脚本中zenity --info
  • bash -c 'DISPLAY=:0 zenity --info

而且当然:

  • sudo restart udev
  • sudo udevadm control --reload-rules

但我无法获得输出zenity --info

因此如何通过 udev 规则运行 Bash 脚本? 如果我遗漏了什么,请建议我。

答案1

最有可能的是,该命令正在执行,但不知道在哪里显示输出。我假设您正在使用 root 以外的用户登录 X,并且该规则很可能以 root 身份运行。尝试以下命令:

su - your_X_user_here -c 'export DISPLAY=:0;zenity --info'

对于运行任何bash脚本按照命令:

su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'

答案2

我最近发现一种优雅的方式从 udev 规则显示 GUI 或 X 任务,而不必担心 DISPLAY。对于使用 的 Shell 脚本,其原理是相同的export

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV}:如果当前tty用户启动X,否则将其删除

答案3

对于阅读本文的其他人来说,我能够让我的脚本在 Kali Linux 2016 中运行的唯一方法是这样的:

#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'

相关内容