AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 626744
Accepted
Thomas Ward
Thomas Ward
Asked: 2015-05-22 13:18:03 +0800 CST2015-05-22 13:18:03 +0800 CST 2015-05-22 13:18:03 +0800 CST

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

  • 772

因此,我们正在努力在这里建立一个环境,在我们的 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"

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

想法?

12.04
  • 2 2 个回答
  • 6908 Views

2 个回答

  • Voted
  1. Best Answer
    user.dz
    2015-05-25T07:32:09+08:002015-05-25T07:32:09+08:00

    我以前遇到过同样的问题 non effective ignore_device。我不明白为什么我总是选择其他解决方案。

    • 好吧,ignore_device从 udev 版本 148 中删除了。请参阅发行说明或变更日志

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

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

      参考资料: Archlinux Wiki:Udisks

    其他解决方案使用 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'"
    

    参考: udev rule with few parent device attributes

    • 7
  2. Thomas Ward
    2015-05-23T06:26:26+08:002015-05-23T06:26:26+08:00

    注意:已被 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_device12.04 中的选项。必须编写所有内容。:/

    • 2

相关问题

  • 跨(全屏)应用程序拖放,通过 Alt-Tab 切换

  • Guake 终端在 Unity 中显示错误

  • 字体损坏:通过字符的行

  • 使用活动应用程序自动切换到工作区

  • 如何查看实际内存及其属性(插槽位置、大小、速度...)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve