如何在 USB 设备插件上运行自定义脚本?

max*_*zig 47 usb udev uuid

在当前的 Linux 发行版(如 Debian/CentOS/Fedora)下,在 USB 设备插件上自动执行自定义脚本的最先进方法是什么?

例如,如果您想根据 UUID(或设备 ID 等)自动挂载/复制某些文件/卸载 USB 大容量存储设备。

Gil*_*il' 30

把这样的一行放在一个文件中/etc/udev/rules.d

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"
Run Code Online (Sandbox Code Playgroud)

添加一个子句,例如NAME="subdir/mydisk%n"如果您想在/dev.

运行udevadm info -a -n sdb以查看您可以匹配哪些属性(attribute=="value"; 替换sdb为自动分配给磁盘的设备名称,对应于/dev插入时创建的新条目)。请注意,您可以使用ATTRS任何一个节中的子句:您可以选择任何一个节,但这些ATTRS子句必须全部来自同一节,您不能混合和匹配。您可以将ATTRS子句与不同节中列出的其他类型的子句混合使用。

  • 添加到此,为了完整起见,文件需要具有后缀“.rules”,并且目录中的文件按词法顺序读取(约定使用数字前缀对它们进行排序),并且它们可以位于下面`/etc/`、`/usr/lib` 或 `/run`。有关更多信息,[RTFM](https://www.freedesktop.org/software/systemd/man/udev.html)。 (2认同)

max*_*zig 14

我查看/lib/udev/rules.d了磁盘相关规则的示例。在 Ubuntu 系统上,一个规则文件提供了ID_FS_UUID_ENC可以在自己的规则文件中使用的环境变量。

因此,我将自定义规则文件放在/etc/udev/rules.d/foodevice.rules. 由于它没有以数字为前缀,所以它最终由 udev 运行。顺便说一句,udev 守护进程会监视/etc/udev/rules.d更改,因此您无需在文件更改时重新启动它。

内容/etc/udev/rules.d/foodevice.rules为:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"
Run Code Online (Sandbox Code Playgroud)

(这是一个规则 - 您必须在 ENV 子句之后删除换行符,因为 udev 没有行继续机制)

由 udev 启动的程序会阻塞守护进程 - 因此它不应运行很长时间。我通过at- 即通过从执行实际工作的过程中分离来解决它:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
Run Code Online (Sandbox Code Playgroud)