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

Ami*_* KK 18 scripts logging screenshot mass-storage

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

con*_*use 14

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

如何解决您的问题:

首先,您需要在您的设备上收集信息。假设您连接了它,并且知道它在名称下/dev/sdb1。如果是这样运行:

udevadm info -a -p $(udevadm info -q path -n /dev/sdb1)
Run Code Online (Sandbox Code Playgroud)

该命令将输出有关您的设备的信息。这是一个相当长的。您需要找到唯一标识设备的东西。这可能是一个类似序列的序列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"
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的实际 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 规则的优秀教程。不过,您在这里阅读的内容应该足以引起人们的注意。

  • 然后你将不得不写它或者更具体地说明你想要的到底是什么。例如,我看不到屏幕截图会告诉您什么。还“转储系统日志”到哪里?“任何异常”也是一个相当广泛的术语。我们不是您的私人军队——如果您对 bash 脚本有一点了解,那么现在您拥有了自己编写脚本所需的所有工具。 (4认同)