如何讓 libusb 以非 root 身分工作?

如何讓 libusb 以非 root 身分工作?

我正在 Lubuntu 16.04.3 LTS 上使用 HIDAPI 製作一個自訂 USB HID 裝置以及一個與之配套的桌面應用程式。我們myapp暫時就這樣稱呼它。

顯然,如果我這樣做$ ./myapplibusb_open()就會失敗LIBUSB_ERROR_ACCESS(在我的調試器中顯示為-3;花了一段時間才弄清楚這一點,因為枚舉似乎沒有很好地記錄)
但如果我這樣做$ sudo ./myapp,它就會成功。
我真的不想myapp擁有 root 權限,那麼如果沒有 root 權限,我該如何與我的 USB 裝置通訊?


我希望得到答案這裡,但似乎就在此時被放棄了。它說了一些關於用戶權限的內容,但我似乎在我的系統上找不到它。我想我可能會找到一個名為usb或的小組libusb,我可以將自己加入其中,但沒有那麼幸運。


這個問題在另一個 SE 網站上有一個答案,使用一些嚴格的文本文件來全局更改權限(可能是一個壞主意)或特定設備的權限,但是:

  1. 這不是我要找的「麻瓜的調整」。
  2. 大多數這些文件都會發出警告,禁止直接修改,因為它們是自動產生的。那麼我如何確定隨機包更新不會消除我的更改並因此中斷myapp
  3. 無論如何,它似乎沒有做任何事情。我按照這些說明進行操作並重新啟動,並且myapp在用戶權限的情況下仍然無法與 USB 通訊。

答案1

這仍然不是我真正想要的“麻瓜的調整”,但至少這是有效的:

顯然 udev 有兩個目錄(我不知道為什麼):

  • /etc/udev/rules.d
  • /lib/udev/rules.d

我一直在搞亂/lib這個,卻一事無成。我找到了/etc那個這裡,而且它確實有效:


SUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"

  • VID是個USB-IF 指派的供應商 ID相關設備的*

  • PID是相關設備的供應商分配的產品 ID *

  • 0666提供與此行匹配的任何內容的通用讀取/寫入存取權限

    *$ lsusb查看所有連接的 USB 裝置及其 ID。

/etc/udev/rules.d/xx-my-rule.rules(可能需要 root/sudo 權限)

  • xx是大於 50 的任意數字(預設值為 50,數字越大優先)
  • my-rule隨便你怎麼稱呼它
  • 必須結束於.rules

然後udevadm control --reload-rules(可能還需要 root/sudo 權限),並且它應該「僅適用於」特定的 VID/PID 對。


另一個選擇是稍微收緊權限,即使用TAG+="uaccess"代替MODE="0666".這限制了對當前登入(實體)使用者而不是所有使用者的存取。謝謝@Lekensteyn!

答案2

對於其他為此苦苦掙扎的人 - 我需要添加組=“plugdev”在 Ubuntu 18.04 下我的 udev 規則使其工作。

對於我的 BTD-400 適配器,該文件/etc/udev/rules.d/51-usb-device.rules內容如下:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e8", GROUP="plugdev", TAG+="uaccess"

相關內容