udev 规则只允许一个供应商和型号的 USB 驱动器,但不允许其他

Tho*_*ard 5 udisks udev usb-storage 12.04

因此,我们正在努力在这里设置一个环境,在该环境中我们在 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"
Run Code Online (Sandbox Code Playgroud)

我的问题是这些规则都不起作用,我不知道这是否是正确的方法。

想法?

use*_*.dz 7

我以前遇到过同样的问题,无效的ignore_device。我不明白为什么我总是采用其他解决方案。

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

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

  • 一个快速的替代方法是使用:ENV{UDISKS_PRESENTATION_HIDE}="1"(Ubuntu 12.04)。为释放(> = 12.10),其包括udisks2使用: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"
Run Code Online (Sandbox Code Playgroud)

好吧,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'"
Run Code Online (Sandbox Code Playgroud)

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

  • 令人惊叹和完美,这实现了**正是**我们(和我)所需要的。为你点赞! (2认同)