当检测到新的 USB 存储设备时,如何运行 Shell 脚本?

当检测到新的 USB 存储设备时,如何运行 Shell 脚本?

我想要一个脚本,它可以在插入 USB 大容量存储器(上面有文件“OKdump”)后立即转储日志并开始记录日志。并且如果检测到任何异常(例如视觉上存在的错误),我希望它截取屏幕截图并将其保存在同一个驱动器上。

答案1

使用 Udev。Udev 是一个设备管理器守护进程。除其他任务外,它还负责命名您的设备。您可以通过将具有特定语法的文件放入规则目录中来定义 udev 规则。规则可以做很多事情 - 特别是当某个设备连接时,它们可以运行脚本。

如何解决您的问题:

首先,您需要收集有关设备的信息。假设您已连接设备,并且知道它的名称为/dev/sdb1。如果是这样,请运行:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)

该命令将输出有关您的设备的信息。它相当冗长。您需要找到唯一标识设备的东西。这可能是序列号,ATTRS{serial}=="UA04FLGC"或其他属性的组合,例如ATTRS{idVendor}ATTRS{idProduct}。大多数名称或多或少都是不言自明的。选择一个或几个看起来合理的组合 - 如果它们不起作用,请尝试其他方法。

找到唯一标识符后,创建一个/etc/udev/rules.d以两位数字开头并以 结尾的文件.rules。这两个数字指定处理这些 .rules 文件的顺序 -70-usb-log-custom.rules对您来说应该是个不错的选择。此规则文件的语法可能非常复杂。如果您感兴趣,请谷歌搜索 udev。如果没有兴趣,只需打开新创建的文件并将其编辑为如下所示:

# /etc/udev/rules.d/70-usb-log-custom.rules

KERNEL=="sd?1", ATTRS{serial}=="UA04FLGC", ACTION=="add", SYMLINK+="cusb1", RUN+="/home/confus/bin/usb-encrypt.sh add %k"
ENV{ID_FS_USAGE}=="crypto", ACTION=="remove", RUN+="/home/confus/bin/usb-encrypt.sh remove %k"
SUBSYSTEM=="usb", SYSFS{idVendor}=="1781", SYSFS{idProduct}=="0c9f", GROUP="users", MODE="0666"

这是我正在使用的实际 udev 文件。它包含三条规则。每行都是一条规则。第一行运行脚本,在连接加密磁盘时创建解密设备。第二行在解密设备被移除时使用不同的选项调用相同的脚本。第三行设置另一个相关设备的权限。

您很可能只需要第一行。删除其余部分并插入正确的序列号(或您选择的用于识别设备的参数组合)。

我的文件的说明:

KERNEL=="sd?1"表示我们在此规则中寻找的设备的名称类似于或类似的名称。问号是任意字母的通配符。是此处的唯一标识符。对于我所讨论的另一台设备(第三行),我没有使用序列号/dev/sda1,而是使用和的组合来识别它。/dev/sdc1ATTRS{serial}=="UA04FLGC"SYSFS{idVendor}=="1781"SYSFS{idProduct}=="0c9f"

ACTION=="add"告诉规则它应该只在添加设备时执行,而不是在删除设备时执行。

SYMLINK+="cusb1"创建到磁盘的符号链接,以便人们可以在下找到它/dev/cusb1

RUN+="/home/confus/bin/usb-encrypt.sh add %k"运行脚本并将“add”和“%k”(设备名称)传递给它。

我不会给出更多细节,因为有关于 udev 规则的优秀教程。不过你在这里读到的内容应该足以让你开始。

相关内容