GNU/Linux >> Linux Esercitazione >  >> Linux

Comando per determinare le porte di un dispositivo (come /dev/ttyusb0)?

Ho una domanda riguardo alle porte in Linux. Se collego il mio dispositivo tramite USB e voglio controllare la sua porta non posso farlo usando il comando lsusb, che specifica solo il numero del bus e il numero del dispositivo su questo bus:

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

C'è un comando che mi dice a quale porta è collegato direttamente il dispositivo? L'unico modo per farlo fino ad ora era disconnettersi e riconnettersi e utilizzare il comando:

[[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

Nell'ultima riga si può vedere che il mio dispositivo è collegato a /dev/ttyUSB0 .

Risposta accettata:

Non sono del tutto sicuro di cosa stai chiedendo. Menzioni "port" più volte, ma poi nel tuo esempio dici che la risposta è /dev/ttyUSB0 , che è un percorso di sviluppo del dispositivo, non una porta. Quindi questa risposta riguarda la ricerca del percorso di sviluppo per ciascun dispositivo.

Di seguito è riportato uno script rapido e sporco che scorre i dispositivi in ​​/sys alla ricerca di dispositivi USB con un ID_SERIAL attributo. In genere solo i dispositivi USB reali avranno questo attributo e quindi possiamo filtrare con esso. In caso contrario, vedrai molte cose nell'elenco che non sono dispositivi fisici.

#!/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

Sul mio sistema, ciò si traduce in quanto segue:

/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

Spiegazione:

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

Dispositivi visualizzati in /dev avere uno dev file nel loro /sys directory. Quindi cerchiamo directory che soddisfano questi criteri.
 

syspath="${sysdevpath%/dev}"

Vogliamo il percorso della directory, quindi rimuoviamo /dev .
 

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

Questo ci fornisce il percorso in /dev che corrisponde a questo /sys dispositivo.
 

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

Questo filtra le cose che non sono dispositivi reali. Altrimenti otterrai cose come controller e hub USB. L'exit esce dalla subshell, che scorre all'iterazione successiva del ciclo.
 

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

La proprietà udevadm info -q property --export comando elenca tutte le proprietà del dispositivo in un formato che può essere analizzato dalla shell in variabili. Quindi chiamiamo semplicemente eval su questo. Questo è anche il motivo per cui racchiudiamo il codice tra parentesi, in modo da utilizzare una subshell e le variabili vengono cancellate a ogni ciclo.
 

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

Più filtraggio di cose che non sono dispositivi reali.
 

echo "/dev/$devname - $ID_SERIAL"

Spero che tu sappia cosa fa questa linea 🙂

Correlati:come registrare i comandi all'interno di un "sudo su -"?
Linux
  1. Quando usare /dev/random vs /dev/urandom?

  2. Linux – /dev/xvde1?

  3. Come mappare il dispositivo /dev/sdX e /dev/mapper/mpathY dal dispositivo /dev/dm-Z

  4. DD da /dev/zero a /dev/null... cosa succede realmente

  5. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0

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

Quando dovrei usare /dev/shm/ e quando dovrei usare /tmp/?

echo o print /dev/stdin /dev/stdout /dev/stderr

A cosa serve `/dev/console`?

Crea un dispositivo a blocchi virtuale che scrive su /dev/null

Differenze tra /dev/sda e /dev/sda1