我正在嘗試編寫一個 udev 規則來允許 USB 大容量儲存設備,但拒絕其他任何設備(鍵盤、滑鼠等)。我在網路上找到了這個:
ACTION!="add", GOTO="deauthorize_end"
SUBSYSTEM!="usb", GOTO="deauthorize_end"
TEST!="authorized", GOTO="deauthorize_end"
## make hubs deauthorize all devices by default
TEST=="authorized_default", ATTR{authorized_default}="0", GOTO="deauthorize_end"
## CHECK FOR USB MASS STORAGE HERE
SOMETHING=="something", ENV{valid}="1"
## authorize matched devices, warn about the rest
ENV{valid}=="1", ENV{valid}="", ATTR{authorized}="1", GOTO="deauthorize_end"
RUN+="/usr/local/bin/usb-unauth $devpath"
LABEL="deauthorize_end"
我將其保存在 /etc/udev/rules.d/99-usb-unauth.rule 中 - 我的問題是檢查 USB 大容量存儲位,我不知道要放在那裡的內容。該規則運作良好,因為我可以將其他內容放入其中,例如供應商/產品 ID,並且它們運作良好。
我嘗試過 SUBSYSTEM=="block"、SUBSYSTEMS=="block" 以及發現使用的各種其他按鍵,udevadm info -a -p $(udevadm info -q path -n /dev/myDevNode)
但似乎沒有任何東西可以讓它接受驅動器。
我究竟做錯了什麼?我可以匹配什麼來捕捉全部大容量儲存設備?它需要是全部,而不僅僅是特定的一個。
編輯:查看 udev 日誌,我的規則似乎運行得太快:
set children_max to 16
validate module index
Check if link configuration needs reloading.
seq 2693 queued, 'add' 'usb'
seq 2693 forked new worker [26127]
seq 2693 running
no db file to read /run/udev/data/c189:224: No such file or directory
device 0xb77b68e0 has devpath '/devices/pci0000:00/0000:00:1d.0/usb2/2-1'
device 0xb77b6c90 has devpath '/devices/pci0000:00/0000:00:1d.0/usb2'
device 0xb77b7040 has devpath '/devices/pci0000:00/0000:00:1d.0'
device 0xb77b72c8 has devpath '/devices/pci0000:00'
IMPORT builtin 'usb_id' /lib/udev/rules.d/50-udev-default.rules:9
IMPORT builtin 'hwdb' /lib/udev/rules.d/50-udev-default.rules:9
MODE 0664 /lib/udev/rules.d/50-udev-default.rules:41
ATTR '/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/authorized' writing '1' /etc/udev/rules.d/99-usb-deauth.rules:21
當然,我的規則,從 99-... 開始不應該運行第三?我想我需要它稍後運行。
另一個編輯:所以我認為問題是,一旦我們通過SUBSYSTEM!="usb", GOTO="deauthorize_end"
(即 SUBSYSTEM==“usb”),該規則的其餘部分就會被評估,我可以從 udevadm 看到,此時 usb 子系統只是“USB”要獲得“USB儲存”,它需要上升一級。有沒有辦法按照規則做到這一點?