web-dev-qa-db-fra.com

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

J'ai une question concernant les ports sous Linux. Si je connecte mon appareil via USB et que je veux vérifier son port, je ne peux pas le faire en utilisant 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 l'appareil est connecté directement? La seule façon de le faire jusqu'à présent était de se déconnecter et de se reconnecter et d'utiliser 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 appareil est connecté à / dev/ttyUSB.

54
71GA

Je ne sais pas trop ce que vous demandez. Vous mentionnez plusieurs fois "port", mais dans votre exemple, vous dites que la réponse est /dev/ttyUSB0, Qui est un chemin de développement de périphérique, pas un port. Cette réponse consiste donc à trouver le chemin de développement pour chaque périphérique.

Ci-dessous est un script rapide et sale qui parcourt les périphériques dans /sys À la recherche de périphériques USB avec un attribut ID_SERIAL. En règle générale, seuls les vrais périphériques USB auront cet attribut, et nous pouvons donc filtrer avec lui. Si nous ne le faisons pas, vous verrez beaucoup de choses dans la liste qui ne sont pas des appareils 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 ce qui suit:

/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 /dev Ont un fichier dev dans leur répertoire /sys. Nous recherchons donc des répertoires correspondant à ces critères.

syspath="${sysdevpath%/dev}"

Nous voulons le chemin du répertoire, donc nous supprimons /dev.

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

Cela nous donne le chemin dans /dev Qui correspond à cet appareil /sys.

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

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

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

La commande udevadm info -q property --export Répertorie toutes les propriétés du périphérique dans un format qui peut être analysé par le shell en variables. Nous appelons donc simplement eval à ce sujet. C'est aussi la raison pour laquelle nous encapsulons le code entre parenthèses, afin d'utiliser un sous-shell, et les variables sont effacées sur chaque boucle.

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

Plus de filtrage des choses qui ne sont pas de véritables appareils.

echo "/dev/$devname - $ID_SERIAL"

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

84
Patrick

Vous pouvez utiliser cette commande pour explorer votre appareil s'il est connecté à usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
12
Naveen

En supposant que vous savez ce que l'appareil que vous avez branché, dans 14.04 Ubuntu, au moins, il y a la commande usb-devices 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 le bus et le port, ainsi que le numéro de périphérique que lsusb donne.

5
Gertlex

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

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

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

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
2
VeggieVampire