Beim Zugriff auf das (angeschlossene) usb-device erhalte ich folgende
Fehlermeldung:
----------------------------------------
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File
"/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecu
stomize.py", line 540, in runfile
execfile(filename, namespace)
File "/home/rfr/workspace/python/testUSBaccess.py", line 9, in
<module>
raise ValueError('Device not found')
ValueError: Device not found
>>> runfile('/home/rfr/workspace/python/testUSBaccess.py',
wdir=r'/home/rfr/workspace/python')
DEVICE ID 173a:2198 on Bus 002 Address 011 =================
bLength : 0x12 (18 bytes)
bDescriptorType : 0x1 Device
bcdUSB : 0x200 USB 2.0
bDeviceClass : 0x0 Specified at interface
bDeviceSubClass : 0x0
bDeviceProtocol : 0x0
bMaxPacketSize0 : 0x20 (32 bytes)
idVendor : 0x173a
idProduct : 0x2198
bcdDevice : 0x100 Device 1.0
iManufacturer : 0x1 Error Accessing String
iProduct : 0x2 Error Accessing String
iSerialNumber : 0x3 Error Accessing String
bNumConfigurations : 0x1
CONFIGURATION 1: 102 mA ==================================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x2 Configuration
wTotalLength : 0x20 (32 bytes)
bNumInterfaces : 0x1
bConfigurationValue : 0x1
iConfiguration : 0x0
bmAttributes : 0x80 Bus Powered
bMaxPower : 0x33 (102 mA)
INTERFACE 0: Mass Storage ==============================
bLength : 0x9 (9 bytes)
bDescriptorType : 0x4 Interface
bInterfaceNumber : 0x0
bAlternateSetting : 0x0
bNumEndpoints : 0x2
bInterfaceClass : 0x8 Mass Storage
bInterfaceSubClass : 0x6
bInterfaceProtocol : 0x50
iInterface : 0x0
ENDPOINT 0x81: Bulk IN ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x81 IN
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x40 (64 bytes)
bInterval : 0x0
ENDPOINT 0x2: Bulk OUT ===============================
bLength : 0x7 (7 bytes)
bDescriptorType : 0x5 Endpoint
bEndpointAddress : 0x2 OUT
bmAttributes : 0x2 Bulk
wMaxPacketSize : 0x40 (64 bytes)
bInterval : 0x0
EINS
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File
"/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecu
stomize.py", line 540, in runfile
execfile(filename, namespace)
File "/home/rfr/workspace/python/testUSBaccess.py", line 13, in
<module>
dev.set_configuration()
File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 799,
in set_configuration
self._ctx.managed_set_configuration(self, configuration)
File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 127,
in managed_set_configuration
self.managed_open()
File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 105,
in managed_open
self.handle = self.backend.open_device(self.dev)
File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py",
line 722, in open_device
return _DeviceHandle(dev)
File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py",
line 600, in _init_
_check(_lib.libusb_open(self.devid, byref(self.handle)))
File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py",
line 552, in _check
raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 13] Access denied (insufficient permissions)
>>>
-----------------------------------
den folgende Source produziert:
_--------------------------
import usb.core
import usb.util
# find our device
dev = usb.core.find(idVendor=0x173a, idProduct=0x2198)
print dev
# was it found?
if dev is None:
raise ValueError('Device not found')
print 'EINS'
# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()
# get an endpoint instance
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]
ep = usb.util.find_descriptor(
intf,
# match the first OUT endpoint
custom_match = \
lambda e: \
usb.util.endpoint_direction(e.bEndpointAddress) == \
usb.util.ENDPOINT_OUT)
assert ep is not None
# write the data
ep.write('test')
------------------------------------
Dazu folgende Fragen:
wie kann ich das Programm so schreiben, dass verschiedene IdVendors und
IdProduct numbers erkannt werden können?
Was genau sagt mir die Fehlermeldung?
Grüsse
Robert
>usb.core.USBError: [Errno 13] Access denied (insufficient permissions)
->Programm als root ausführen.
R. F. schrieb: > Was genau sagt mir die Fehlermeldung? Einfach mal lesen... > [Errno 13] Access denied (insufficient permissions) Ganz nebenbei wuerd ich das Programm gleich so schreiben, dass es auch zu Python 3 kompatible ist. Gleich richtig machen erspart spaeter viel arbeit.
Lukas S. schrieb: >>usb.core.USBError: [Errno 13] Access denied (insufficient > permissions) > > ->Programm als root ausführen. Nein, das war noch nie die richtige Antwort. Stattdessen löst man das ganz einfach indem man die Rechte bedarfsgerecht vergibt.
>Nein, das war noch nie die richtige Antwort. Stattdessen löst man das >ganz einfach indem man die Rechte bedarfsgerecht vergibt. Oder nach öffnen des File Descriptors Privilegien droppen und sich am besten noch mit chroot() zusätzlich absichern - wenn mans richtig machen will. :D
Lukas Straub schrieb: >>Nein, das war noch nie die richtige Antwort. Stattdessen löst man das >>ganz einfach indem man die Rechte bedarfsgerecht vergibt. > Oder nach öffnen des File Descriptors Privilegien droppen und sich am > besten noch mit chroot() zusätzlich absichern - wenn mans richtig > machen will. :D Genau, allen Menschen den Generalschlüssel zur Bundesbank geben und sie bitten kurz nach dem Betreten der Bank den Schlüssel abzugeben und nicht zum Tresoröffnen zu nutzen.
Norbert schrieb: > Lukas Straub schrieb: >>>Nein, das war noch nie die richtige Antwort. Stattdessen löst man das >>>ganz einfach indem man die Rechte bedarfsgerecht vergibt. >> Oder nach öffnen des File Descriptors Privilegien droppen und sich am >> besten noch mit chroot() zusätzlich absichern - wenn mans richtig >> machen will. :D > > Genau, allen Menschen den Generalschlüssel zur Bundesbank geben und sie > bitten kurz nach dem Betreten der Bank den Schlüssel abzugeben und nicht > zum Tresoröffnen zu nutzen. Bei UNIX ist das so gang und gäbe und man kann sich sicher sein, dass es überall funktioniert.
Lukas S. schrieb: > Bei UNIX ist das so gang und gäbe und man kann sich sicher sein, dass es > überall funktioniert. Nein, das ist es nicht. Sonst müssten alle Programme die derart geschrieben wurden mit dem setuid Bit versehen werden und root gehören. Das geht schon mal (dem Herrn sein Dank) mit scripts nicht.
1 | #!/usr/bin/env python3
|
2 | import os |
3 | |
4 | print(os.getuid()) |
5 | print(os.geteuid()) |
6 | print(os.getresuid()) |
7 | ~
|
8 | ~
|
1 | norbert@Entwicklung:/tmp$ l x.py |
2 | -rwsr-xr-x 1 root root 99 Jan 8 20:12 x.py |
3 | norbert@Entwicklung:/tmp$ ./x.py |
4 | 1000 |
5 | 1000 |
6 | (1000, 1000, 1000) |
7 | norbert@Entwicklung:/tmp$ |
Wie man sieht wird das 's' von '-rwsr-xr-x' freundlicherweise ignoriert und ich habe bei Programmausführung weiterhin meine Rechte und nicht root-Rechte. Schreibt man das Gleiche zB. in C, dann geht es natürlich (ist aber schmutzig weil unnötig). Also, auf unixoiden Systemen versucht man die Anzahl der SUID Programme so gering wie möglich zu halten. Daemons geben selbstverständlich alle Rechte die sie nicht benötigen ab oder laufen in einem speziellen Kontext. Dementsprechend nicht maximale Rechte vergeben und hoffen, sondern nur minimal nötige Rechte und entspannt zurücklehnen.
Also, ich will auf den Bus zugreifen. Wie stelle ich die Rechte richtig ein, und wie ermittlele ich, welche Rechte ich brauche? Grüsse Robert
Hallo Robert, sobald du mit einem USB-Gerät kommunizieren willst, sind Schreib-/Leserechte erforderlich. Lege eine udev-Regel an, die die Rechte entsprechend einstellt. 1. Im Ordner /etc/udev/rules.d eine Textdatei z.B. 99-local.rules anlegen und folgende Regel hineinschreiben:
1 | ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="173a", ATTR{idProduct}=="2198", RUN{builtin}+="uaccess"
|
2. Konfiguration vom udev-Dienst neu lesen lassen:
1 | udevadm control -R |
aus. 3. Das USB-Gerät trennen und wieder verbinden. Dann sollte dein Script auch ohne root-Rechte laufen. Falls nicht, kannst du mit
1 | udevadm monitor -u |
die Aktionen anzeigen lassen, während das Gerät wieder verbunden wird. Es sollte dann sichtbar sein, dass "uaccess" gesetzt wird. Viel Spaß, Detlef
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.