Ern*_*oso 15 server usb udev usb-modem
我需要编写一个脚本来重新启动 USB 加密狗。我拥有所有工具,但无法将我的 /dev/ttyUSBx 链接到物理总线和设备。一个问题是我有三个具有相同 ID 供应商和 ID 产品的加密狗。
如果我做 lsusb 输出是:
Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Run Code Online (Sandbox Code Playgroud)
我已将其附加到:
/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
Run Code Online (Sandbox Code Playgroud)
但是我想知道哪个设备与哪个总线设备相关。例如,我需要获得以下信息:
/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
Run Code Online (Sandbox Code Playgroud)
我正在使用 Ubuntu Server 10.04 并测试了这些工具:
lsusb
hal
lsmod
Run Code Online (Sandbox Code Playgroud)
但我无法得到这种关系。
Joh*_*ber 11
因为我没有你的硬件,我不能给你一个确切的答案。
我建议你去有问题的设备,例如:
ls -l /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
并获取主次节点号。假设他们是 116, 7
然后去:
ls -l /sys/dev/char/116:7
Run Code Online (Sandbox Code Playgroud)
( char,因为 tty 是字符设备,如果您要跟踪磁盘设备,您将指定block而不是char)
在命令的输出中,您将看到类似以下内容的内容:
lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c
该目录/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/及其子目录有很多关于设备的信息。例如,/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum和/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum。在我的系统上,这些与 /var/log/syslog 中的设备热插拔条目中提到的总线和设备编号相匹配。
在我的系统上为 /dev/video0 工作的其他东西:
find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
小智 11
将字符设备映射到相应的 USB 设备和总线编号确实不是一个好方法/dev/ttyUSB0。 但是,这是可能的!
像这样的事情可能会奏效:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
从那里,您将获得有关设备及其父设备的大量信息。现在,这只是解析这些数据以获得您想要的。我过去使用过这个:
echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"
Run Code Online (Sandbox Code Playgroud)
现在,如果那不是一口,我不知道是什么!让我们分解一下:
udevadm info --name=/dev/ttyUSB0 --attribute-walk - 返回有关设备及其父设备的信息
sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- 解析这些数据并返回任何包含“devnum”或“busnum”属性的行。我们假设首先列出“busnum”......在这种情况下......我们可以抓住输出的前两行。
head -n 2- 获取输出的前 2 行。我们可以在这里变得更花哨,但我们只是假设最接近的父级的“busnum”和“devnum”将首先列出。
awk '{$1 = sprintf("%03d", $1); print}' - 获取这些数字并用零填充它们。
echo /dev/bus/usb... - 所有这些爵士乐都包含在一个echo语句中,用空格替换换行符。如果要切断尾随的换行符,可以添加-nto echo。
tr " " "/" - 用正斜杠替换输出中的空格
这将输出如下内容:
/dev/bus/usb/001/011
Run Code Online (Sandbox Code Playgroud)
...当然,这就是设备。如果您愿意,您可以busnum:001 devnum:011通过一些调整轻松输出类似的内容:
echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`
Run Code Online (Sandbox Code Playgroud)