USBHID学习
USBHID學習
- 前言
- 第一步:準備一個列表,里面有我們目前所有的USB設備名稱
- 第二步:通過列表,反向獲取沒被我們定義到的id號
- 第三步:獲取所有的剩余id,并把他們存放到一個數組中方便調用.之后在循環中設置對應值
- 多出來的第四步...
前言
之前寫過一個類似的,shell觸發調用python腳本,也是為了將新接入的鍵鼠全部屏蔽.代碼如下:
import os # xinput_list = os.popen("xinput --list") # print(xinput_list.read())xinput_list = os.popen("xinput --list|grep Keyboard|awk -F= '{print $2}'|awk '{print $1}'") # print(xinput_list.read())keyboard_list = [] for i in xinput_list:keyboard_list.append(int(i))xinput_list = os.popen("xinput --list|grep Mouse|awk -F= '{print $2}'|awk '{print $1}'") for i in xinput_list:keyboard_list.append(int(i))while keyboard_list:i = keyboard_list.pop()print(i)os.system(f"xinput --set-prop {i} 'Device Enabled' 0")但是也能看到,實際上是檢測了xinput名稱中的"Keyboard"和"Mouse"兩個字段來實現的,不具有通用性,而且這玩意一運行…別想著接入鍵鼠改回來了,所以準備重寫一個白名單機制的腳本.這次就直接去shell了.
保持目前的設備usb設備,當有其他名稱的設備加入時,直接禁用它.由于沒找到白名單策略,只能自己寫了
另:下面順序會相當混亂,碰見什么坑就寫啥,因為shell腳本語言基本沒用過
第一步:準備一個列表,里面有我們目前所有的USB設備名稱
靜態寫入對應的usb白名單設備,并嘗試將其打印出來
#!/bin/bashSLEEP_TIME=5 USB1="Logitech Gaming Mouse G402" USB2="H264 USB Camera: USB Camera" USB3="SINO WEALTH USB KEYBOARD" USB_HID_WHITE=("$USB1" "$USB2" "$USB3")for i in "${USB_HID_WHITE[@]}";doecho "$i" done ------------------- 打印: (glh) adocir@adocir:~/PycharmProjects/glh$ /bin/bash /home/adocir/PycharmProjects/glh/test.sh Logitech Gaming Mouse G402 H264 USB Camera: USB Camera SINO WEALTH USB KEYBOARD使用傳遞字符串參數來給列表定義,列表的值以空格分離.注意,傳遞參數的時候存在三種傳遞方式:
但請注意前兩種會把字符串中的空格去掉.
原因在于1和2中都先進行了取值運算,得出結果a b c,然后把它傳給了echo;
而3中""是一種引用。引用指將字符串用引用符號引起來,以防止特殊字符被shell腳本重解釋為其他意義。使用引用的方法讓它里面的特殊字符“空格”不要被解釋為其他的亂七八糟的東西。
到這里成功定義了白名單列表.
第二步:通過列表,反向獲取沒被我們定義到的id號
直接就想到grep -v這個參數了唄.grep是選擇,grep -v是反向選擇
另外,``這個是真的好用
依舊是xinput list獲取所有設備,在for循環中按序grep -v反向取值,最后打印出來的剩余字段就是我們所篩選出來的(記得把master pointer給剔出掉,總線你不能禁用啊).
第三步:獲取所有的剩余id,并把他們存放到一個數組中方便調用.之后在循環中設置對應值
還能咋,取值啊,設置啊.順便把語法規范一下
#!/bin/bashsleep 3 # 定義白名單設備名 USB1="Logitech Gaming Mouse G402" USB2="H264 USB Camera: USB Camera" USB3="SINO WEALTH USB KEYBOARD" USB_HID_WHITE=("$USB1" "$USB2" "$USB3") # 添加白名單設備名USBHID_VAR=$(xinput list) # 獲取列表echo "$USBHID_VAR" for i in "${USB_HID_WHITE[@]}";doecho "$i" # echo "$usbhid_var"|grep -v "$i"USBHID_VAR=$(echo "$USBHID_VAR"|grep -v "$i") # echo "$usbhid_var" done USBHID_VAR=$(echo "$USBHID_VAR"|grep -v "master pointer") USBHID_VAR=$(echo "$USBHID_VAR"|grep -v "master keyboard") echo "$USBHID_VAR"HID_NUM=$(echo "$USBHID_VAR"|awk -F= '{print $2}'|awk '{print $1}') echo "$HID_NUM" for i in "${HID_NUM[@]}";doecho "$i"xinput --set-prop "$i" 'Device Enabled' 0 done上機測試,手動運行測試ok,接下來自動化就行了
多出來的第四步…
本來吧,鍵鼠類的usb設備,會被ubuntu識別為一個hidraw設備,只需要在/etc/udev/rules.d文件夾中自定義一個規則,例如KERNEL=="hidraw*", RUN+="/home/adocir/test.sh",就可以在插入鍵鼠時觸發這段shell腳本,從而達到自動化的目標.但是不知道為啥,寫入這段調試的時候,發現shell腳本確實如預期一樣觸發了,但是xinput沒有任何值返回???已測試和權限、~/.bashrc等無關,迫不得已,只能另寫一個循環調用的腳本,并在gnome-session-properties中進行調用…如果哪位大神知道是為什么請指教一下
總結
- 上一篇: oracle静默安装报错,静默安装Ora
- 下一篇: 常用的http响应状态码大全