comando per determinare le porte di un dispositivo (come / dev / ttyUSB0)


47

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

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

Esiste un comando che mi dice la porta alla quale il dispositivo è collegato direttamente? L'unico modo per farlo fino ad ora era disconnettere, riconnettere e usare il comando:

[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

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


Cosa stai cercando di realizzare? Vuoi associare un dispositivo a /devuna voce in lsusb? Oppure vuoi elencare tutti i dispositivi /devderivati ​​da un dispositivo USB fisico? O vuoi solo ls /dev/ttyUSB*?
— Patrick,

Ho solo bisogno di un comando che mi dia la porta di un dispositivo e non mi spinga a disconnettermi e riconnettere i miei dispositivi. ls /dev/ttyUSB*elencherò solo 10 porte ma a questa lista non posso dire quale sia per il mio dispositivo.
— 71GA,

Ho trovato questo utile. lsusb -v
— tjaart55

Risposte:


81

Non sono sicuro di quello che stai chiedendo. Lei parla più volte 'porta', ma poi nel tuo esempio, si dice la risposta è /dev/ttyUSB0, che è un percorso del dispositivo dev, 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 guida i dispositivi alla /sysricerca di dispositivi USB con un ID_SERIALattributo. In genere solo i dispositivi USB reali avranno questo attributo e quindi possiamo filtrare con esso. In caso contrario, vedrai un sacco di 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/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        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

I dispositivi che compaiono in /devhanno un devfile nella loro /sysdirectory. Quindi cerchiamo directory che soddisfino questi criteri.
 

syspath="${sysdevpath%/dev}"

Vogliamo il percorso della directory, quindi eliminiamo /dev.
 

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

Questo ci dà il percorso /devche corrisponde a questo /sysdispositivo.
 

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

Questo filtra le cose che non sono dispositivi reali. Altrimenti otterrai cose come controller e hub USB.
 

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

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

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

Più filtraggio di cose che non sono dispositivi reali.
 

echo "/dev/$devname - $ID_SERIAL"

Spero che tu sappia cosa fa questa linea :-)


2
Grazie. Imparerò molto dalla tua risposta e ora vedo che i termini non mi sono stati del tutto chiari. C'è un modo più breve? Potrebbe essere un comando già integrato nello stesso Linux?
— 71GA,

No. Se ci fosse un comando preesistente, lo consiglierei felicemente.
— Patrick,

Suggerisci di cambiare / bin / bash in / bin / sh e rimuovere il () per la massima compatibilità
— albfan

10

Puoi usare questo comando per esplorare il tuo dispositivo se connesso a usb0:

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

La risposta migliore non ha funzionato sulla mia macchina, ma ha funzionato alla grande. Grazie!
— johnny_boy,

2

Potresti provare qualcosa di simile qui sotto.

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

devo i miei occhi! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Il codice equivalente ma pulito ... ma comunque strano; perché non solo ttyUSB insieme? E cosa significava 2x giri?)
— Peter

1
La revsi usa così l'ultimo campo si accede, questo può essere sostituito da $NF: dandodmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
— Léo Germond

2

Forse vorresti conoscere solo il percorso dell'adattatore USB-seriale che è stato collegato per ultimo?

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

2

Supponendo che tu sappia quale sia il dispositivo collegato, almeno in Ubuntu 14.04 c'è il comando usb-devicesche puoi consultare e trovare le informazioni:

$ 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

E la prima riga elenca bus e porta, nonché il numero del dispositivo che lsusbfornisce.


Questa è la risposta corretta, non so perché non abbia più voti. Il resto è un casino di awk ecc.
— Eric Drechsel,

2
questo non mostra il /dev/*percorso
— xinthose
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.