Was muss ich tun, um Leseberechtigungen für / dev / hidraw * zu haben?
Ich sehe Dinge über udev-Regeln und habe dies im Internet gesehen, aber die Welt von udev ist für mich wie ein fremdes Land, und wenn es eine einfachere Lösung gibt, bei der ich mich einfach einer Gruppe hinzufüge, die dandy wäre ...
(Ubuntu 13.10 Vorschau)
Fühlen Sie sich frei, die Frage erneut zu beantworten - ich bin nicht besonders daran interessiert, was genau unter "Verstecken" zu verstehen ist.
BEARBEITEN:
H'okay, also nur ein paar weitere Informationen, um das Problem zu klären: Ich bin buchstäblich durch Code gegangen, der die POSIX- open()
Methode aufgerufen hat , und habe die errno
für unzureichende Berechtigungen erhalten. Das Ausführen cat
der Datei als normaler Benutzer führt zu einem unzureichenden Berechtigungsfehler, während das Ausführen unter su
zu einem erfolgreichen (wenn auch bedeutungslosen) cat
Vorgang führt.
BEARBEITEN BEARBEITEN:
Auf Anfrage stelle ich den entsprechenden Code mit POSIX-Aufruf zur Verfügung. Es ist aus der HIDAPI-Bibliothek von Signal11 (Funktion hid_open_path
). Ich vertraue darauf, dass dieser Code korrekt ist, da er anscheinend schon seit einiger Zeit verwendet wird. Ich habe einen Kommentar hinzugefügt, der sich dort befindet, wo die relevante errno
Lesung in GDB stattgefunden hat.
hid_device *dev = NULL;
hid_init();
dev = new_hid_device();
if (kernel_version == 0) {
struct utsname name;
int major, minor, release;
int ret;
uname(&name);
ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
if (ret == 3) {
kernel_version = major << 16 | minor << 8 | release;
//printf("Kernel Version: %d\n", kernel_version);
}
else {
printf("Couldn't sscanf() version string %s\n", name.release);
}
}
/* OPEN HERE */
dev->device_handle = open(path, O_RDWR);
// errno at this location is 13: insufficient permissions
/* If we have a good handle, return it. */
if (dev->device_handle > 0) {
/* Get the report descriptor */
int res, desc_size = 0;
struct hidraw_report_descriptor rpt_desc;
memset(&rpt_desc, 0x0, sizeof(rpt_desc));
/* Get Report Descriptor Size */
res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0)
perror("HIDIOCGRDESCSIZE");
/* Get Report Descriptor */
rpt_desc.size = desc_size;
res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc);
if (res < 0) {
perror("HIDIOCGRDESC");
} else {
/* Determine if this device uses numbered reports. */
dev->uses_numbered_reports =
uses_numbered_reports(rpt_desc.value,
rpt_desc.size);
}
return dev;
}
else {
/* Unable to open any devices. */
free(dev);
return NULL;
}
Antworten:
Ich habe es aufgegeben, herumzulaufen und zu versuchen, ein anderes Mittel zu finden als die udev-Regeln. Stattdessen habe ich nur ein bisschen über udev gelernt und eine flippin-Regel geschrieben. Die folgende Zeile wurde in eine
.rules
Datei (ich habe meine genannt99-hidraw-permissions.rules
) eingefügt, die sich unter befindet/etc/udev/rules.d
.Grundsätzlich werden dadurch alle Geräte, die aus dem Hidraw-Subsystem im Kernel kommen, der Gruppe zugewiesen
plugdev
und die Berechtigungen auf r / wr / wr festgelegt (für root [den Standardeigentümer], plugdev bzw. alle anderen). Mit mir selbst in der Plugdev-Gruppe ist alles gut.Nicht ganz so schmelzend, wie ich erwartet hatte. Udev-Regeln scheinen eigentlich ziemlich einfach zu sein ... Ich meine, sie sehen so aus, als könnten sie lächerlich werden, wenn Sie mit einzelnen Produkt-IDs und so weiter zu tun haben, aber sie scheinen verdammt zahm für das zu sein, was sie tun.
quelle
Ok, zuerst wollen wir sehen, was
hidraw
bedeutet und woraus es besteht:Daraus können wir schließen, dass dies
hidraw
eine grobe / direkte Methode ist, um auf das Versteckte zuzugreifen . Schauen wir uns nun an, was unsere Systeme darüber denken:Was
character special
bedeutet das? Zeichenspezialdateien oder Zeichengeräte beziehen sich auf Geräte, über die das System Daten z. B. zeichenweise überträgtgetchar
. wieder ist Wikipedia unser Freund Das gleiche folgt demc
am Anfang desls -l
Befehls.Wie löst dies Ihre Frage? Für den Zugriff auf
/dev/hidraw*
sollten Sie die C-Implementierung zum Lesen / Schreiben in diese Datei verwenden. Wenn Sie jedoch Informationen über die angeschlossenen HIDs wünschen, sollten Sie nachsehen/sys/class/hidraw/hidraw*/
. Beispiel:Berücksichtigen Sie, dass in den meisten Fällen nur der Kernel direkten Zugriff auf die Geräte hat und Sie nur die im Benutzerbereich bereitgestellten Anrufe verwenden sollten, um mit diesen Geräten zu kommunizieren.
Wenn Sie keinen neuen Treiber / ein neues Gerät entwickeln, sollten Sie nicht zu viel herumspielen
udev
, da Ihr Gehirn dauerhaft geschädigt werden kann.quelle
open()
Methode aufrief , und bekam dieerrno
für unzureichende Berechtigungen. Das Ausführencat
der Datei als normaler Benutzer führt zu einem unzureichenden Berechtigungsfehler, während das Ausführen untersu
zu einem erfolgreichen (wenn auch bedeutungslosen)cat
Vorgang führt. Obwohl ich die zusätzlichen Informationen sehr schätze, hilft sie nicht wirklich bei meinem Problem mit fehlenden Berechtigungen ... Außerdem arbeite ich mit einem experimentellen HID, also bin ich völlig in Ordnung damit, mein Gehirn mit so guten Schmerzen voll zu bekommen udev Zeug ist es notwendig.