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

我想要一个转储日志的脚本,并在插入usb大容量存储器时立即开始登录(文件’OKdump’就可以了)。如果发现任何exception(如同视觉上存在的错误),我想要它采取截图并将其保存在同一个驱动器上。

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

如何解决您的问题:

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

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

该命令将输出有关您的设备的信息。 这是一个相当冗长的。 您需要找到能够唯一标识设备的内容。 这可能是一个类似ATTRS{serial}=="UA04FLGC"或其他属性的组合,如ATTRS{idProduct}ATTRS{idProduct} 。 大多数名字或多或少都是自我解释的。 选择一个或几个似乎合理的组合 – 如果它们不起作用,请尝试其他方法。

找到唯一标识符后,在/etc/udev/rules.d中创建一个以两位数字开头并以.rules结尾的.rules 。 这两个数字指定处理这些.rules-files的顺序 – 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/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规则的优秀教程。 你在这里读到的内容应该足以引起注意。

Interesting Posts