假设有以下lsusb输出
Bus 001 Device 077: ID 154b:6001 PNY
使用iotcl给设备usb总线发送USBDEVFS_RESET
使用ioctl
来源:https://askubuntu.com/questions/645/how-do-you-reset-a-usb-device-from-the-command-line/661#661 http://marc.info/?l=linux-usb&m=121459435621262&w=2
按照上面的输出,编译此程序以后的操作路径为
1 |
usbreset /dev/bus/usb/001/077 |
缺点:ioctl可能需要额外的二进制程序
优点:无需root权限
使用Python的ioctl接口
1 |
python -c 'import os,fcntl;USBDEVFS_RESET = ord("U") << (4*2) | 20;fd = os.open("/dev/bus/usb/001/077", os.O_WRONLY);fcntl.ioctl(fd, USBDEVFS_RESET, 0)' |
USBDEVFS_RESET 在一般系统上都是21780,在Mips上可能是536892692
使用VID、PID遍历SYSFS: /sys/bus/usb/devices/
这里存储了所有的设备,但是父目录不够直观,需要写脚本遍历找出这个设备
1 2 3 4 5 6 7 8 9 |
vid=154b pid=6001 idVendor=$(dirname $(grep -r $vid /sys/bus/usb/devices/*/idVendor |head -1 2>/dev/null)) idProduct=$(dirname $(grep -r $pid /sys/bus/usb/devices/*/idProduct |head -1 2>/dev/null)) if [[ $idVendor != '' ]] && [[ $idVendor == $idProduct ]] && [[ -d $idProduct ]];then (echo 0 >$idProduct/authorized && echo 1 >$idProduct/authorized && echo 'Reset Success') || echo 'Reset Fail' else echo 'Not found Deivce' fi |
缺点:需要Root权限