11

我正在基于 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 用户)。谢谢!

4

5 回答 5

35

我认为最好的方法是为您的设备创建一个 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规则。

于 2014-03-28T21:23:27.557 回答
9

我认为这可能是该问题的临时解决方案,而Preston 的解决方案将始终如一地工作。

1. 检查为您的设备分配了哪个 USB 端口

ls您可以通过调用命令两次(第一次与设备断开连接,第二次与设备连接)来确定为您的设备分配了哪个 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是您的设备。

2. 给每个人(其他)写权限

根据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

3.每次拔出或关闭系统重复步骤1,2

如果您从 USB 端口拔出设备或关闭系统,您为 USB 端口所做的操作将重置。

您必须再次重复步骤 1,2。

这就是为什么我说我的解决方案是临时的(易变的)。

进一步阅读

我发现这两篇博客文章将有助于您的理解。

于 2016-01-10T07:08:50.523 回答
5

将规则添加到/etc/udev/rules.d/ 以下内容后:

SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="1234", MODE="0666", OWNER="YOU_USER_ID"

不要忘记重新加载规则:

$ sudo udevadm control --reload-rules
于 2017-08-25T08:09:05.490 回答
4

那么您可以在 root 用户模式下运行您的应用程序并摆脱权限问题。但是,您应该了解以 root 用户运行程序的后果,并且在您完全了解基于 UNIX 的系统上的用户/组权限之前不应该这样做。但是,如果它是您的测试机,我认为您可以执行以下操作(对于程序名称 ./a.out):

  1. 打开终端
  2. 转到您的程序可执行文件所在的目录(检查您的 netbeans 创建项目并键入cd completepath)。
  3. sudo ./a.out
  4. 现在命令提示符会要求输入 root 密码

现在您应该能够成功运行该程序。

但是,如果您想为特定用户提供/更改读/写/执行权限,您应该尝试了解chmod命令。您必须更改对目录(/dev/bus/usb/002/)和驻留在此目录下的任何特定文件的权限。希望这些信息有用。

于 2014-03-28T13:58:31.790 回答
1

对于您想要与之通信的每件设备,您都需要找出 idVendor(如果需要,还可以找到 idProduct)。这可以通过 bash 命令“lsusb”来完成。你得到 idVendor:idProduct 对。例子:

pstallinga@mycomputer:~$ 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/”目录中:

  • 规则按字母顺序处理(所以 70 在 60 之后,等等)
  • '/etc/udev/rules.d/' 规则在 '/lib/udev/rules.d/' 规则之后处理

举个例子,这对我来说适用于 Owon 示波器。我将此文本放在目录“/lib/udev/rules.d/”中名为“70-owon.rules”的文件中:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"

我可以在我的 C 程序中与示波器通信。

于 2020-07-29T14:53:19.237 回答