因此,我们正在努力在这里建立一个环境,在我们的 Linux 笔记本电脑上设置一个安全存储,这样我们的 Linux 笔记本电脑只能连接特定的 USB 驱动器:金士顿 DataTraveler 2.0。供应商:型号代码如下(来自lsusb
):Bus 003 Device 003: ID 0951:1665 Kingston Technology
我一直在尝试让这些规则发挥作用,但在 12.04 环境中,这些规则不起作用。(请注意,我已使用#
前置行做了注释,但它们不在 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"
我的问题是这些规则都不起作用,而且我不知道这是否是正确的方法。
有什么想法吗?
答案1
我以前也遇到过同样的问题,但效果并不好ignore_device
。我不知道为什么,所以总是选择其他解决方案。
嗯,
ignore_device
udev 148 版已经删除了。请参阅发行公告或者变更日志如果你注意到,所有建议使用它的主题都是旧的(~2009)。
一种快捷的替代方法是使用:
ENV{UDISKS_PRESENTATION_HIDE}="1"
(Ubuntu 12.04)。对于包含以下内容的版本(>=12.10),udisks2
请使用:ENV{UDISKS_IGNORE}="1"
。
其他解决方案是使用 SYSFS。要么device/authorized
(如 solsTiCe 所述),device/remove
要么driver/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'"
答案2
注意:Sneetsher 的答案已过时。由于遗留原因,此答案保留在此处。
因此,我大概解决了这个问题,但过程很痛苦。
我重新检查了规则中的限制,并更改了功能。显然,12.04 不支持该ignore_device
选项。因此,我即兴编写了一个卸载脚本。由于这些系统上只有一个可用的 USB 端口,我们最终得到以下结果,我知道这可能会破坏其他东西:
/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
- 只是一个脚本,首先检查当前存在的设备,然后检查所有其他驱动器设备,并且只有在脚本运行时才卸载。由于所有设备都是sdb
、sdc
等,因此有办法让它适用于所有设备。
故事的寓意是:系统ignore_device
在 12.04 中忽略了该选项。必须编写脚本。:/