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.