问题描述
我想要一个转储日志并在插入 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 规则的优秀教程。不过,你在这里读到的内容应该足以引起注意。