使用 udev 规则在 USB 插入时运行脚本

JTe*_*TeK 19 linux autorun udev

我正在尝试设置一个脚本以在每次插入 USB 设备时运行。我创建了文件/etc/udev/rules.d/90-local.rules并添加了以下规则:

ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
Run Code Online (Sandbox Code Playgroud)

问题是当驱动器连接时,什么也没有发生。出于调试目的,该脚本被操纵以使用通知发送发送通知,该通知已安装并在终端上正常工作。

脚本的路径是正确的,因为我在终端中运行了那个确切的命令,没有任何问题。

小智 8

我有同样的问题。这对我有用:

尝试将您的脚本复制到/usr/local/bin并更改.rules文件中的目录。

另外,我不知道 SYSFS 是什么,但我更喜欢使用 ATTR 属性。

下面一行是我的.rules文件的内容:

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"
Run Code Online (Sandbox Code Playgroud)


use*_*686 7

notify-send 需要访问您的 DBus 会话总线,这有两个原因:

  • 没有关于会话的信息。当由 udev 启动时,您的脚本对您的登录位置或是否登录一无所知。使用 X11 的多席位仍然很棘手,但用户切换适用于 X11 和控制台会话。许多人还通过网络使用 SSH、VNC 和 NX。

    DISPLAY=:0一半的时间会起作用,但这充其量仍然是猜测。)

  • 被 DBus 策略拒绝。即使您的脚本以某种方式找到了您的 X11 会话,它也无法发送通知,因为脚本root不是您的用户帐户运行的。

  • `for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;` 用通知发送对我有用 (2认同)