/dev/hidraw:讀取權限
我需要做什麼才能獲得 /dev/hidraw* 的讀取權限?
我在網上看到有關 udev 規則的東西,但 udev 的世界對我來說就像是一片陌生的土地,如果有某種更簡單的解決方案,我只需將自己添加到一個花花公子的組中…
(Ubuntu 13.10 預覽版)
隨意重新標記這個問題 - 我不太熱衷於“hidraw”到底是什麼。
編輯:
好吧,所以,只是更多的資訊來澄清這個問題:我逐字逐句地通過了呼叫 POSIX
open()
方法的程式碼,並獲得了errno
權限不足的權限。以普通使用者身份在文件上執行cat
會導致權限不足錯誤,而在文件下執行su
會導致cat
操作成功(儘管沒有意義)。編輯編輯:
應要求,我將通過 POSIX 呼叫提供相關程式碼。它來自 Signal11(函式
hid_open_path
)的 HIDAPI 庫。我相信這段程式碼是正確的,因為它顯然已經使用了很長一段時間了。我添加了一條評論,位於errno
GDB 中相關閱讀的位置。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; }
除了 udev 規則,我放棄了四處尋找其他方法,而是僅僅了解了一些關於 udev 的知識並寫了一個翻轉規則。以下行放置
.rules
在99-hidraw-permissions.rules
位於/etc/udev/rules.d
.KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"
基本上,這會將來自核心中的 hidraw 子系統的所有設備分配給該組
plugdev
,並將權限設置為 r/wr/wr(對於 root$$ the default owner $$、plugdev 和其他所有人)。隨著我自己加入了 plugdev 組,一切都變得美好起來。 不像我預期的那樣大腦融化。Udev 規則實際上看起來很簡單……我的意思是,如果您處理的是單個產品 ID 之類的東西,它們看起來會變得很荒謬,但它們的工作似乎非常馴服。