/ dev / hidraw: Leseberechtigungen

8

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 errnofür unzureichende Berechtigungen erhalten. Das Ausführen catder Datei als normaler Benutzer führt zu einem unzureichenden Berechtigungsfehler, während das Ausführen unter suzu einem erfolgreichen (wenn auch bedeutungslosen) catVorgang 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 errnoLesung 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;
}
Benutzer
quelle
@Braiam Code Snippet hinzugefügt.
Benutzer

Antworten:

11

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 .rulesDatei (ich habe meine genannt 99-hidraw-permissions.rules) eingefügt, die sich unter befindet /etc/udev/rules.d.

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"

Grundsätzlich werden dadurch alle Geräte, die aus dem Hidraw-Subsystem im Kernel kommen, der Gruppe zugewiesen plugdevund 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.

Benutzer
quelle
Dies funktionierte für mich, da ich das Roccat-Konfigurationstool verwenden wollte und Root-Berechtigungen benötigte. Damit kann ich das Tool mit normalem Benutzer benutzen.
LnxSlck
5

Um etwas zu verstehen ... fang an, davon zu wissen.

Ok, zuerst wollen wir sehen, was hidrawbedeutet und woraus es besteht:

  • hid (Human Interface Device): Ein Human Interface Device oder HID ist eine Art Computergerät, das direkt mit Menschen interagiert und am häufigsten Eingaben von Menschen entgegennimmt und möglicherweise Ausgaben an Menschen liefert. Quelle Wikipedia
  • raw: Dies ist als roh gemeint , aber im Linux-Ambiente bedeutet es auch direkt.

Daraus können wir schließen, dass dies hidraweine grobe / direkte Methode ist, um auf das Versteckte zuzugreifen . Schauen wir uns nun an, was unsere Systeme darüber denken:

$ ls -l /dev/hidraw*
crw------- 1 root root 251, 0 Aug  3  2013 /dev/hidraw0
crw------- 1 root root 251, 1 Aug  3  2013 /dev/hidraw1
crw------- 1 root root 251, 2 Aug  3  2013 /dev/hidraw2
$ file /dev/hidraw*
/dev/hidraw0: character special 
/dev/hidraw1: character special 
/dev/hidraw2: character special

Was character specialbedeutet das? Zeichenspezialdateien oder Zeichengeräte beziehen sich auf Geräte, über die das System Daten z. B. zeichenweise überträgt getchar. wieder ist Wikipedia unser Freund Das gleiche folgt dem cam Anfang des ls -lBefehls.

Was muss ich tun, um Leseberechtigungen für / dev / hidraw * zu haben?

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:

$ cat /sys/class/hidraw/hidraw2/device/uevent
DRIVER=hid-generic
HID_ID=0003:000015D9:00000A4C
HID_NAME= USB OPTICAL MOUSE
HID_PHYS=usb-0000:00:1d.1-2/input0
HID_UNIQ=
MODALIAS=hid:b0003g0001v000015D9p00000A4C

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.

Ich sehe Dinge über udev-Regeln und habe dies im Netz gesehen, aber die Welt von udev ist für mich wie ein fremdes Land

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.

Braiam
quelle
Ich ging buchstäblich durch Code, der die POSIX- open()Methode aufrief , und bekam die errnofür unzureichende Berechtigungen. Das Ausführen catder Datei als normaler Benutzer führt zu einem unzureichenden Berechtigungsfehler, während das Ausführen unter suzu einem erfolgreichen (wenn auch bedeutungslosen) catVorgang 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.
Benutzer