Devices

/dev/hidraw:讀取權限

  • August 4, 2013

我需要做什麼才能獲得 /dev/hidraw* 的讀取權限?

我在網上看到有關 udev 規則的東西但 udev 的世界對我來說就像是一片陌生的土地,如果有某種更簡單的解決方案,我只需將自己添加到一個花花公子的組中…

(Ubuntu 13.10 預覽版)

隨意重新標記這個問題 - 我不太熱衷於“hidraw”到底是什麼。

編輯:

好吧,所以,只是更多的資訊來澄清這個問題:我逐字逐句地通過了呼叫 POSIXopen()方法的程式碼,並獲得了errno權限不足的權限。以普通使用者身份在文件上執行cat會導致權限不足錯誤,而在文件下執行su會導致cat操作成功(儘管沒有意義)。

編輯編輯:

應要求,我將通過 POSIX 呼叫提供相關程式碼。它來自 Signal11(函式hid_open_path)的 HIDAPI 庫。我相信這段程式碼是正確的,因為它顯然已經使用了很長一段時間了。我添加了一條評論,位於errnoGDB 中相關閱讀的位置。

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 的知識並寫了一個翻轉規則。以下行放置.rules99-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 之類的東西,它們看起來會變得很荒謬,但它們的工作似乎非常馴服。

引用自:https://unix.stackexchange.com/questions/85379