J'ai besoin d'écrire un script pour redémarrer les dongles USB. J'ai tous les outils mais je ne peux pas lier mon / dev / ttyUSBx au BUS physique et au DISPOSITIF. Un problème est que j'ai trois dongles avec le même fournisseur d'identification et le même produit d'identification.
Si je fais lsusb, la sortie est:
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
Et je l'ai attaché à:
/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
Mais je veux savoir quel périphérique est lié à quel périphérique de bus. Par exemple, je dois obtenir ce qui suit:
/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
J'utilise Ubuntu Server 10.04 et j'ai testé les outils:
lsusb
hal
lsmod
Mais je ne peux pas obtenir la relation.
Il n'y a vraiment pas de bon moyen de mapper des périphériques de caractères comme
/dev/ttyUSB0
les numéros de périphérique et de bus USB correspondants. MAIS, c'est possible!Quelque chose comme ça pourrait fonctionner:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
De là, vous obtiendrez un tas d'informations sur l'appareil et ses appareils parents. Maintenant, il s'agit simplement d'analyser ces données pour obtenir ce que vous voulez. Je l'ai utilisé dans le passé:
Maintenant, si ce n'est pas une bouchée, je ne sais pas ce que c'est! Décomposons-le:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
- retourne des informations sur l'appareil et ses appareils parentssed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'
- analyse ces données et retourne toutes les lignes contenant l'attribut "devnum" ou "busnum". Nous supposerons que "busnum" est répertorié en premier ... et dans ce cas ... nous pouvons simplement saisir les deux premières lignes de sortie.head -n 2
- Saisissez les 2 premières lignes de sortie. Nous pourrions obtenir plus de fantaisie ici, mais nous faisons simplement l'hypothèse que le "busnum" et le "devnum" du parent le plus proche seront répertoriés en premier.awk '{$1 = sprintf("%03d", $1); print}'
- Prend ces chiffres et les garnit de zéros.echo /dev/bus/usb
... - tout ce jazz est enveloppé dans uneecho
déclaration pour remplacer les nouvelles lignes par des espaces. Vous pouvez ajouter le-n
àecho
si vous souhaitez couper la nouvelle ligne de fin.tr " " "/"
- remplacer les espaces dans la sortie par des barres obliquesCela produira quelque chose comme:
... qui, bien sûr, est l'appareil. Si vous le souhaitez, vous pouvez facilement produire quelque chose comme
busnum:001 devnum:011
avec quelques ajustements:la source
Vous pouvez trouver toutes les informations sur le nœud en utilisant la commande ci-dessous:
la source