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 -" ?