udev规定只允许一个供应商和型号USB驱动器,但没有其他

因此,我们正在努力建立一个环境,在我们的Linux笔记本电脑上安装一个安全的存储设备,这样我们的Linux笔记本电脑只能连接一个特定的USB驱动器:金士顿DataTraveler 2.0。 供应商:型号代码是这个(来自lsusb ): Bus 003 Device 003: ID 0951:1665 Kingston Technology

我一直试图让这些规则起作用,但在12.04环境中规则不起作用。 (注意我用#prepended行做了评论,但它们不在udev文件中):

 # If a device is NOT a Kingston drive, ignore it. SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device" # If a device is a Kingston drive, but is NOT the model we have, ignore it. SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device" # If a device is a Kingston drive and is the model we have, then run a script SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh" 

我遇到的问题是没有这些规则正在运行,我不知道这是否是正确的方法。

思考?

我遇到过与非有效ignore_device相同的问题。 我无法弄清楚为什么然后我总是采用其他解决方案。

  • 好吧,用udev版本148删除了ignore_device请参阅发行说明或更改日志

    如果您注意到,所有使用它的主题都是旧的(~2009)。

  • 一个快速的替代方案是使用: ENV{UDISKS_PRESENTATION_HIDE}="1" (Ubuntu 12.04)。 对于包含udisks2发行版(> = 12.10): ENV{UDISKS_IGNORE}="1"

    参考: Archlinux Wiki:Udisks

其他解决方案正在使用SYSFS。 device/authorized (如提到的solsTiCe), device/removedriver/unbind 。 请参阅仅在选定的USB端口上使用大容量存储设备 – 如何使用?

除了只有一个品牌/型号之外,如何拒绝所有存储都会遇到困难。 因此规则匹配条件应该过滤单个设备节点,不能再过滤(没有子设备或父设备)。 这就是为什么我添加了KERNELS=="[1-9]*-[0-9]*"

 KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="0951", ENV{UDISKS_PRESENTATION_HIDE}="1" KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", ENV{UDISKS_PRESENTATION_HIDE}="1" 

好吧,UDisks只隐藏挂钩。 使用SYSFS驱动程序取消绑定可能会更好。

 KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}!="125f", ENV{IF_STORAGE_REMOVE_ME}="1" KERNELS=="[1-9]*-[0-9]*", SUBSYSTEMS=="usb", DRIVERS=="usb", ATTRS{idVendor}=="125f", ATTRS{idProduct}!="c96a", ENV{IF_STORAGE_REMOVE_ME}="1" ENV{IF_STORAGE_REMOVE_ME}=="1", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'" 

参考: 具有少量父设备属性的udev规则

注意:Sneetsher的答案已经废弃。 由于遗留原因,这个答案留在这里。

所以,我解决了这个问题,这是一个痛苦的事情。

我重新检查了规则中的限制,并改变了function。 显然,12.04不遵守ignore_device选项。 所以,我即兴创作并编写了一个卸载脚本。 由于这些系统上只有一个functionUSB端口,我们最终得到以下内容,我知道可能会破坏其他内容:

/etc/udev/rules.d/100-restrict-usb-devices.rules

 # If a device is NOT a Kingston drive, ignore it. ACTION=="add", ATTRS{idVendor}!="0951", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh" # If a device is a Kingston drive, but is NOT the model we have, ignore it. ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}!="1665", OPTIONS+="ignore_device", RUN+="/usr/bin/logger UnauthorizedUSBConnected", RUN+="/lib/udev/unmount.sh" # If a device is a Kingston drive and is the model we have, then run a script ACTION=="add", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1665", RUN+="/lib/udev/syslog-authorized-device-connected.sh", RUN+="/usr/bin/logger AuthorizedUSBConnected" 

/lib/udev/unmount.sh – 只是一个首先检查当前现有设备的脚本,然后检查所有其他驱动器设备并卸载当且仅当脚本运行时。 由于所有设备都是sdbsdc等,因此有办法让它适用于所有设备。


故事的道德:系统忽略了12.04中的ignore_device选项。 得到一切脚本。 :/