Я пишу приложение на C / C ++ в NetBeans на основе libusb-1.0 в Ubuntu 12.04.
Я могу получить основную информацию от устройства 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). Спасибо!
Ну, вы можете запустить свое приложение в режиме пользователя root и избавиться с разрешения
вопрос. Однако вы должны знать о последствиях запуска программы в
пользователь root и не должен делать, пока вы полностью не понимаете разрешение пользователя / группы
в системе на основе UNIX. Однако, если это ваша тестовая машина, я думаю, что вы можете сделать
следующее (для имени программы ./a.out):
Теперь вы сможете успешно запустить программу.
Однако, если вы хотите предоставить / изменить разрешение на чтение / запись / выполнение для конкретного пользователя, вам следует попытаться понять CHMOD команда. Вам придется изменить разрешение на каталог (/ dev / bus / usb / 002 /) и любой конкретный файл, находящийся в этом каталоге. Надеюсь, эта информация будет полезна.
Я думаю, что лучший способ сделать это — создать файл правил udev для ваших устройств. Просто создайте текстовые имена файлов, например myVendor.rules
и поместите в него следующий текст (где 1234
Ваш идентификатор продавца:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", MODE="0666"SUBSYSTEM=="usb_device", ATTRS{idVendor}=="1234", MODE="0666"
Поместите этот файл Udev в свой /etc/udev/rules.d/
каталог. Этот файл udev предоставит доступ на чтение и запись ВСЕМ пользователям, в том числе непривилегированным пользователям, для ВСЕХ USB-устройств с совпадающим идентификатором поставщика. Это означает, что ваше устройство доступно для пользователей без полномочий root даже без изменения исполняемого файла или запуска его с помощью sudo.
Этот пример udev специфичен для idVendor, но вы можете ограничить его VID и PID, чтобы быть более строгими. Проверьте эта статья для написания удев правила для получения дополнительной информации.
Я думаю, что это может быть временным решением проблемы, в то время как Решение Престона будет работать последовательно.
Вы можете выяснить, какой USB-порт назначен вашему устройству, вызвав ls
команда два раза (сначала с устройством отсоединены а второй с устройством связано).
$ 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 / автобус / 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