当前位置: 首页>>技术教程>>正文


scripts – 当检测到新的 USB 存储设备时如何运行 shell 脚本?

, , ,

问题描述

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

最佳办法

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

如何解决您的问题:

首先,您需要收集设备上的信息。假设您已连接它,并且知道它的名称为 /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-files – 70-usb-log-custom.rules 应该是您的不错选择。该规则文件的语法可能非常复杂。如果你有兴趣,google一下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/sdc1 或类似的名称。问号是任何字母的通配符。 ATTRS{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 规则的优秀教程。不过,你在这里读到的内容应该足以引起注意。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14361.html,未经允许,请勿转载。