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

使用传递字符串参数来给列表定义,列表的值以空格分离.注意,传递参数的时候存在三种传递方式:

  1. $var
  2. ${var}
  3. “$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中进行调用…如果哪位大神知道是为什么请指教一下