stu*_*ent 5 permissions usb udev
我的扫描仪有问题。Xsane 仅以 root 身份运行。作为普通用户使用它没有找到任何设备。将用户添加到组中saned或scanner没有帮助。
最后我通过改变解决了问题
# 'libusb' device nodes
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664"
Run Code Online (Sandbox Code Playgroud)
到
# 'libusb' device nodes
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
Run Code Online (Sandbox Code Playgroud)
在/lib/udev/rules.d/50-udev-default.rules
但是我不明白为什么这有效以及它是否有任何负面副作用。我猜想这会给任何 USB 设备上的所有用户提供写入权限,但我不知道这是否正确、为什么正确以及为什么这可以解决扫描仪问题。
谁能详细解释一下为什么它有效以及它是否有任何副作用。
我的系统是:ubuntu 12.04,扫描仪是从存储库安装的HP PSC 1200 all in one设备。hplip
libusb旨在允许 USB 设备的用户空间驱动程序:换句话说,它允许应用程序libusb向设备发送本身不理解的命令。
因此,libusb必须将从计算机传递到 USB 设备的任何数据视为写入操作。这甚至包括琐碎的写入,例如向扫描仪发送命令来描述其扫描功能。
对设备的只读访问libusb仅适用于会自发向计算机发送数据的设备,例如键盘或鼠标。
小智 4
看起来 Udev(位于 man 中)在插入 USB 设备等动态设备时对其进行管理。然后它会在 /dev 中的某处实例化它们。(就像我的例子中的 /dev/bus/usb/002 一样。)这个 /dev 节点必须有一些权限,Udev 从 /lib/udev/rules.d/ 中的文件获取权限,有一些神秘的语法与设备到条目。
在这种情况下,来自 usb 子系统且类型为 usb_device 的任何内容都会获得指定的文件模式。(标准权限,664 是 rw-rw-r--,666 是 rw-rw-rw-。)因此,您将授予所有 USB 设备的所有写入权限。如果您不信任所有用户,这听起来并不是一件好事。如果您是唯一的用户,您可能可以相信自己。Libusb 似乎想要 USB 设备节点的写权限来完成它的事情,如果不这样做则拒绝执行任何操作。这听起来不太正确,因为我只是尝试从设备中读取数据。
权限可以更具体,您可以通过 USB 供应商 (VID) 和产品 ID (PID) 等指定设备。因此,可以创建一个仅适用于您的扫描仪的文件,并为所有其他 USB 设备保留默认权限。https://wiki.archlinux.org/index.php/udev有一个关于 Udev 的页面,看起来对这一切都很有用。如果您创建一个以较高数字开头的文件,例如“60-my-usb-scanner.rules”(较高的数字优先),并且有一个列出您的扫描仪的规则,例如:
SUBSYSTEM=="usb", ATTRS{idVendor}=="f1e2", ATTRS{idProduct}=="1f2e", MODE="0666"
Run Code Online (Sandbox Code Playgroud)
这应该只是设置指定设备的权限(VID = 0xF1E2,PID = 0x1F2E,注意:对 udev 使用小写十六进制数字)。然后,您可以通过执行以下命令让 Udev 注意此更改:
udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)