我正在 Ubuntu 12.04 上基于 libusb-1.0 在 NetBeans 中编写 C/C++ 应用程序。 我可以从 USB 设备获取基本信息(例如接口描述),但无法打开该设备。 函数 libusb_open 给我错误:
libusb:error [op_open] libusb couldn't open USB device /dev/bus/usb/002/003: Permission denied.
libusb:error [op_open] libusb requires write access to USB device nodes.
我知道我需要更改权限,但我不知道如何更改(我是一个非常基本的 Linux 用户)。谢谢!
我认为最好的方法是为您的设备创建一个 udev 规则文件。只需创建一个名为
myVendor.rules
的文本文件,然后将以下文本放入其中(其中 1234
是您的供应商 ID:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", MODE="0666"
SUBSYSTEM=="usb_device", ATTRS{idVendor}=="1234", MODE="0666"
将此 udev 文件放入您的
/etc/udev/rules.d/
目录中。此 udev 文件将向所有用户(包括非特权用户)授予具有匹配供应商 ID 的所有 USB 设备的读写访问权限。这意味着即使不修改可执行文件或使用 sudo 运行它,非 root 用户也可以访问您的设备。
此 udev 示例特定于 idVendor,但您可以将其限制为 VID 和 PID 以更加严格。查看这篇关于编写 udev 规则的文章以获取更多信息。
我认为这可能是问题的临时解决方案,而普雷斯顿的解决方案将始终有效。
您可以通过调用
ls
命令两次(第一次是设备 disconnected,第二次是设备 connected)来确定为您的设备分配了哪个 USB 端口。
$ ls -l /dev/bus/usb/00*
/dev/bus/usb/001:
total 0
crw-rw-r-- 1 root root 189, 0 1월 10 12:08 001
crw-rw-r-- 1 root root 189, 1 1월 10 12:08 002
/dev/bus/usb/002:
total 0
crw-rw-r-- 1 root root 189, 128 1월 10 12:08 001
crw-rw-r-- 1 root root 189, 129 1월 10 12:08 002
/dev/bus/usb/003:
total 0
crw-rw-r-- 1 root root 189, 256 1월 10 12:08 001
crw-rw-r-- 1 root root 189, 257 1월 10 12:08 002
crw-rw-r-- 1 root root 189, 258 1월 10 12:08 003
crw-rw-r-- 1 root root 189, 259 1월 10 12:08 004
crw-rw-r-- 1 root root 189, 260 1월 10 12:08 005
crw-rw-r-- 1 root root 189, 263 1월 10 15:42 008 <-- this is your device
假设 /dev/bus/usb/003/008 是您的设备。
根据
ls -l
命令的输出,root用户(组)对003/008 port
具有读/写权限,而其他用户仅具有读权限。
crw-rw-r-- 1 root root 189, 263 1월 10 15:42 008
您可以允许每个用户使用
chmod
命令在特定设备上写入。使用 chmod
命令时,您需要 sudo
权限。
$ sudo chmod o+w /dev/bus/usb/003/008
或
$ sudo chmod a+w /dev/bus/usb/003/008
现在如果你检查 USB 的权限,你必须看到这个输出
$ ls -l /dev/bus/usb/003/008
crw-rw-rw- 1 root root 189, 263 1월 10 15:42 /dev/bus/usb/003/008
如果您将设备从 USB 端口拔出或关闭系统,您对 USB 端口所做的操作将会重置。
您必须再次重复步骤1,2。
这就是为什么我说我的解决方案是暂时的(不稳定的)。
我发现这两篇博客文章对你的理解会有帮助。
将规则添加到
/etc/udev/rules.d/
后
像这样的东西:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"
不要忘记重新加载规则:
$ sudo udevadm control --reload-rules
对于您想要与之通信的每台设备,您都需要找出
idVendor
(如果需要,还可以找到 idProduct
)。您可以通过 bash 命令 lsusb
来完成此操作。您将获得 idVendor:idProduct
对。示例:
$ lsusb
Bus 002 Device 005: ID 5345:1234 Owon PDS6062T Oscilloscope
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 005: ID 046a:000c Cherry GmbH
Bus 001 Device 004: ID 0480:a006 Toshiba America Inc External Disk 1.5TB
Bus 001 Device 003: ID 046a:0023 Cherry GmbH Keyboard
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
然后为其创建规则。您放置在以“.rules”结尾的文件中的规则,并将该文件放入
/etc/udev/rules.d/
或 /lib/udev/rules.d/
目录中:
/etc/udev/rules.d/
规则在/lib/udev/rules.d/
规则之后处理举个例子,这对我的 Owon 示波器有效。我将此文本放入目录
70-owon.rules
中名为 /lib/udev/rules.d/
的文件中:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"
我可以在我的 C 程序中与示波器进行通信。
你可以在 root 用户模式下运行你的应用程序并摆脱权限 问题。但是,您应该了解在以下位置运行该程序的后果: root 用户,在您完全了解用户/组权限之前不应执行此操作 在基于 UNIX 的系统上。但是,如果这是您的测试机,我认为您可以这样做 以下(程序名称./a.out):
cd completepath
)。sudo ./a.out
现在你应该能够成功运行程序了。
但是,如果您想为特定用户提供/更改读/写/执行权限,您应该尝试了解 chmod 命令。您必须更改目录(/dev/bus/usb/002/)以及驻留在该目录下的任何特定文件的权限。希望这些信息有用。