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