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/bash
SLEEP_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[@]}";do
echo "$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
使用传递字符串参数来给列表定义,列表的值以空格分离.注意,传递参数的时候存在三种传递方式:
- $var
- ${var}
- “$var”
但请注意前两种会把字符串中的空格去掉.
原因在于1和2中都先进行了取值运算,得出结果a b c,然后把它传给了echo;
而3中""是一种引用。引用指将字符串用引用符号引起来,以防止特殊字符被shell脚本重解释为其他意义。使用引用的方法让它里面的特殊字符“空格”不要被解释为其他的乱七八糟的东西。
到这里成功定义了白名单列表.
第二步:通过列表,反向获取没被我们定义到的id号
直接就想到grep -v这个参数了呗.grep是选择,grep -v是反向选择
另外,``这个是真的好用
#!/bin/bash
SLEEP_TIME=5
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[@]}";do
echo "$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"
依旧是xinput list
获取所有设备,在for循环中按序grep -v
反向取值,最后打印出来的剩余字段就是我们所筛选出来的(记得把master pointer给剔出掉,总线你不能禁用啊).
第三步:获取所有的剩余id,并把他们存放到一个数组中方便调用.之后在循环中设置对应值
还能咋,取值啊,设置啊.顺便把语法规范一下
#!/bin/bash
sleep 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[@]}";do
echo "$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[@]}";do
echo "$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中进行调用…如果哪位大神知道是为什么请指教一下