GNU/Linux >> Tutoriels Linux >  >> Linux

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 ne spécifie que le numéro de bus et le numéro de périphérique sur ce bus :

[[email protected] ~]$ 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 ? Jusqu'à présent, la seule façon de le faire était de se déconnecter et de se reconnecter et d'utiliser la commande :

[[email protected] ~]$ 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/ttyUSB0 .

Réponse acceptée :

Je ne suis pas tout à fait sûr de ce que vous demandez. Vous mentionnez "port" plusieurs fois, 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 appareil.

Vous trouverez ci-dessous un script rapide et sale qui parcourt les périphériques dans /sys recherche de périphériques USB avec un ID_SERIAL attribut. 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 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/"* ]] && exit
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && exit
        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

Périphériques qui apparaissent dans /dev avoir un dev fichier dans leur /sys annuaire. 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 à ce /sys appareil.
 

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

Cela filtre les choses qui ne sont pas de véritables appareils. Sinon, vous obtiendrez des éléments tels que des contrôleurs et des concentrateurs USB. La exit quitte le sous-shell, qui passe à l'itération suivante de la boucle.
 

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

La propriété udevadm info -q property --export La commande 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 sur ce. C'est aussi la raison pour laquelle nous enveloppons le code entre parenthèses, de sorte que nous utilisons un sous-shell, et les variables sont effacées à chaque boucle.
 

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

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

echo "/dev/$devname - $ID_SERIAL"

J'espère que vous savez ce que fait cette ligne 🙂

En relation :Comment enregistrer les commandes dans un "sudo su -" ?
Linux
  1. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  2. Quand utiliser /dev/random contre /dev/urandom ?

  3. Linux-/dev/xvde1 ?

  4. Comment mapper les périphériques /dev/sdX et /dev/mapper/mpathY à partir du périphérique /dev/dm-Z

  5. Comment encoder en base64 /dev/random ou /dev/urandom ?

tty (/dev/tty ) vs pts (/dev/pts) sous Linux

DD de /dev/zero à /dev/null...ce qui se passe réellement

Linux :Différence entre /dev/console , /dev/tty et /dev/tty0

noyau :désactiver /dev/kmem et /dev/mem

echo ou print /dev/stdin /dev/stdout /dev/stderr

Pourquoi < ou > sont-ils nécessaires pour utiliser /dev/tcp