Preciso escrever um script para reiniciar os dongles USB. Eu tenho todas as ferramentas, mas não consigo vincular meu / dev / ttyUSBx ao BUS e DEVICE físico. Um problema é que eu tenho três dongles com o mesmo fornecedor e produto de identificação.
Se eu fizer lsusb, a saída é:
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
E eu anexei a:
/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
Mas quero saber qual dispositivo está relacionado a qual dispositivo de barramento. Por exemplo, preciso obter o seguinte:
/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
Estou usando o Ubuntu Server 10.04 e testei as ferramentas:
lsusb
hal
lsmod
Mas não consigo entender o relacionamento.
Realmente não há uma boa maneira de mapear dispositivos de caracteres como
/dev/ttyUSB0
o dispositivo USB e o número de barramento correspondentes. MAS, é possível!Algo assim pode funcionar:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
A partir daí, você obterá um monte de informações sobre o dispositivo e seus dispositivos principais. Agora, é tudo uma questão de analisar esses dados para obter o que você deseja. Eu usei isso no passado:
Agora, se isso não é um bocado, eu não sei o que é! Vamos dividir:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
- retorna informações sobre o dispositivo e seus dispositivos paised -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'
- analisa esses dados e retorna todas as linhas que contêm o atributo "devnum" ou "busnum". Vamos assumir que "busnum" está listado primeiro ... e, nesse caso, podemos apenas pegar as duas primeiras linhas de saída.head -n 2
- Pegue as 2 primeiras linhas de saída. Poderíamos ter mais graça aqui, mas estamos apenas assumindo que o "busnum" e o "devnum" dos pais mais próximos serão listados primeiro.awk '{$1 = sprintf("%03d", $1); print}'
- Pega esses dígitos e os fecha com zeros.echo /dev/bus/usb
... - todo esse jazz é envolvido em umaecho
declaração para substituir as novas linhas por espaços. Você pode adicionar o-n
queecho
se deseja cortar a nova linha de fuga.tr " " "/"
- substitua os espaços na saída por barrasIsso produzirá algo como:
... que, é claro, é o dispositivo. Se desejar, você pode facilmente produzir algo como
busnum:001 devnum:011
com alguns ajustes:fonte
Você pode encontrar todas as informações sobre o nó usando o comando abaixo:
fonte