commande pour déterminer les ports d'un périphérique (comme / dev / ttyUSB0)

47

J'ai une question concernant les ports sous Linux. Si je connecte mon périphérique via USB et que je souhaite vérifier son port, je ne peux pas le faire à l'aide de la commande lsusb, qui spécifie uniquement le numéro de bus et le numéro de périphérique sur ce bus:

[ziga@Ziga-PC ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Existe-t-il une commande qui m'indique le port auquel le périphérique est connecté directement? Jusqu'à présent, le seul moyen de le faire était de déconnecter et de se reconnecter à l'aide de la commande:

[ziga@Ziga-PC ~]$ dmesg | grep tty
[    0.000000] console [tty0] enabled
[    0.929510] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.378109] systemd[1]: Starting system-getty.slice.
[    4.378543] systemd[1]: Created slice system-getty.slice.
[    8.786474] usb 3-4.4: FTDI USB Serial Device converter now attached to ttyUSB0

Dans la dernière ligne, on peut voir que mon périphérique est connecté à / dev / ttyUSB0 .

71GA
la source
Qu'est-ce que vous essayez d'accomplir? Voulez-vous associer un appareil à /devune entrée lsusb? Ou voulez-vous répertorier tous les périphériques /devdérivés d'un périphérique USB physique? Ou êtes-vous simplement en train de vouloir ls /dev/ttyUSB*?
Patrick
J'ai juste besoin d'une commande qui me donnera le port d'un périphérique et ne me poussera pas à déconnecter et à reconnecter mes périphériques. ls /dev/ttyUSB*ne listera que les ports maybee 10, mais de cette liste, je ne peux pas dire lequel correspond à mon appareil.
71GA
J'ai trouvé cela utile. lsusb -v
tjaart55

Réponses:

81

Je ne suis pas tout à fait certain de ce que vous demandez. Vous mentionnez 'port' plusieurs fois, mais dans votre exemple, vous indiquez que la réponse est /dev/ttyUSB0: il s'agit d'un chemin de développement de périphérique et non d'un port. Donc, cette réponse concerne la recherche du chemin de développement pour chaque périphérique.

Vous trouverez ci-dessous un script rapide et malpropre qui parcourt les périphériques à la /sysrecherche de périphériques USB dotés d'un ID_SERIALattribut. Généralement, seuls les vrais périphériques USB auront cet attribut et nous pouvons donc filtrer avec. Si nous ne le faisons pas, vous verrez beaucoup de choses dans la liste qui ne sont pas des périphériques physiques.

#!/bin/bash

for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        echo "/dev/$devname - $ID_SERIAL"
    )
done

Sur mon système, cela se traduit par:

/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard

Explication:

find /sys/bus/usb/devices/usb*/ -name dev

Les appareils qui apparaissent dans /devont un devfichier dans leur /sysrépertoire. Nous recherchons donc des répertoires correspondant à ces critères.
 

syspath="${sysdevpath%/dev}"

Nous voulons le chemin du répertoire, alors nous nous en débarrassons /dev.
 

devname="$(udevadm info -q name -p $syspath)"

Cela nous donne le chemin /devcorrespondant à cet /sysappareil.
 

[[ "$devname" == "bus/"* ]] && continue

Ceci filtre les choses qui ne sont pas des appareils réels. Sinon, vous obtiendrez des choses comme des contrôleurs et des concentrateurs USB.
 

eval "$(udevadm info -q property --export -p $syspath)"

La udevadm info -q property --exportcommande répertorie toutes les propriétés du périphérique dans un format pouvant être analysé par le shell en variables. Nous faisons donc simplement appel evalà cela. C’est aussi la raison pour laquelle nous encapsulons le code entre parenthèses afin que nous utilisions un sous-shell et que les variables soient effacées à chaque boucle.
 

[[ -z "$ID_SERIAL" ]] && continue

Plus de filtrage des choses qui ne sont pas des appareils réels.
 

echo "/dev/$devname - $ID_SERIAL"

J'espère que vous savez ce que cette ligne fait :-)

Patrick
la source
2
Je vous remercie. Je vais apprendre beaucoup de votre réponse et je vois maintenant que les termes ne sont pas parfaitement clairs pour moi. Y a-t-il un moyen plus court? Peut-être une commande déjà intégrée dans Linux lui-même?
71GA
Nan. S'il y avait une commande préexistante, je la recommanderais avec plaisir.
Patrick
Suggère de changer / bin / bash en / bin / sh et de supprimer le () pour compatibilité maximale
albfan
10

Vous pouvez utiliser cette commande pour explorer votre appareil si vous êtes connecté à usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
Naveen
la source
La meilleure réponse ne fonctionnait pas sur ma machine, mais cela fonctionnait très bien. Merci!
johnny_boy
2

Vous pouvez essayer quelque chose comme ça ci-dessous.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
VeggieVampire
la source
ow mes yeux! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (L'équivalent mais propre ... mais toujours étrange code; pourquoi ne pas simplement ttyUSB ensemble? Et ce qui était 2x rev pour?)
Peter
1
La revest utilisée pour accéder au dernier champ. Elle peut être remplacée par $NF: donnerdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond
2

Peut-être aimeriez-vous connaître le chemin de l'adaptateur USB-série qui s'est connecté en dernier?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1
HRmeteohub
la source
2

En supposant que vous sachiez quel est le périphérique branché, dans 14.04 Ubuntu au moins, usb-devicesvous trouverez la commande que vous pouvez parcourir et trouver les informations:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

Et la première ligne répertorie bus et port, ainsi que le numéro de périphérique lsusbindiqué.

Gertlex
la source
C’est la bonne réponse, je ne sais pas pourquoi il n’a pas plus de votes. Les autres sont en désordre, etc.
Eric Drechsel
2
cela ne montre pas le /dev/*chemin
xinthose