comando para determinar los puertos de un dispositivo (como / dev / ttyUSB0)

47

Tengo una pregunta sobre los puertos en Linux. Si conecto mi dispositivo a través de USB y quiero verificar su puerto, no puedo hacerlo usando el comando lsusb, que solo especifica el número de bus y el número de dispositivo en este bus:

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

¿Hay algún comando que me indique el puerto al que está conectado el dispositivo directamente? La única forma de hacer esto hasta ahora era desconectar y volver a conectar y usar el 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

En la última línea se puede ver que mi dispositivo está conectado a / dev / ttyUSB0 .

71GA
fuente
¿Qué está tratando de lograr? ¿Desea asociar un dispositivo /devcon una entrada lsusb? ¿O desea enumerar todos los dispositivos /devderivados de un dispositivo USB físico? ¿O solo quieres ls /dev/ttyUSB*?
Patrick
Solo necesito un comando que me dará el puerto de un dispositivo y no me empujará a desconectar y volver a conectar mis dispositivos. ls /dev/ttyUSB*solo enumerará quizás 10 puertos, pero de esta lista no puedo decir cuál es para mi dispositivo.
71GA
Encontré esto útil. lsusb -v
tjaart55

Respuestas:

81

No estoy muy seguro de lo que estás preguntando. Menciona 'puerto' varias veces, pero luego, en su ejemplo, dice que la respuesta es /dev/ttyUSB0, que es una ruta de desarrollo del dispositivo, no un puerto. Entonces, esta respuesta se trata de encontrar la ruta de desarrollo para cada dispositivo.

A continuación se muestra un script rápido y sucio que recorre los dispositivos en /sysbusca de dispositivos USB con un ID_SERIALatributo. Por lo general, solo los dispositivos USB reales tendrán este atributo, por lo que podemos filtrar con él. Si no lo hacemos, verá muchas cosas en la lista que no son dispositivos físicos.

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

En mi sistema, esto da como resultado lo siguiente:

/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

Explicación:

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

Los dispositivos que aparecen /devtienen un devarchivo en su /sysdirectorio. Entonces buscamos directorios que coincidan con este criterio.
 

syspath="${sysdevpath%/dev}"

Queremos la ruta del directorio, así que nos despojamos /dev.
 

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

Esto nos da la ruta /devque corresponde a este /sysdispositivo.
 

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

Esto filtra cosas que no son dispositivos reales. De lo contrario, obtendrá cosas como controladores USB y concentradores.
 

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

El udevadm info -q property --exportcomando enumera todas las propiedades del dispositivo en un formato que el shell puede analizar en variables. Entonces simplemente llamamos evala esto. Esta es también la razón por la que envolvemos el código entre paréntesis, de modo que usamos un subshell y las variables se borran en cada bucle.
 

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

Más filtrado de cosas que no son dispositivos reales.
 

echo "/dev/$devname - $ID_SERIAL"

Espero que sepas lo que hace esta línea :-)

Patricio
fuente
2
Gracias. Aprenderé mucho de tu respuesta y ahora veo que los términos no estaban completamente claros para mí. ¿Hay alguna forma más corta? ¿Quizás sea un comando ya integrado en el propio Linux?
71GA
No. Si hubiera un comando preexistente, lo recomendaría con mucho gusto.
Patrick
Sugerir cambiar / bin / bash a / bin / sh y eliminar el () para una compatibilidad máxima
albfan
10

Puede usar este comando para explorar su dispositivo si está conectado a usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
Naveen
fuente
La respuesta principal no funcionó en mi máquina, pero funcionó muy bien. ¡Gracias!
johnny_boy
2

Podrías probar algo como esto a continuación.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
Veggie Vampiro
fuente
¡Ay, mis ojos! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (El código equivalente pero limpio ... pero aún extraño; ¿por qué no simplemente ttyUSB juntos? ¿Y para qué fue 2x rev?)
Peter
1
Se revusa para acceder al último campo, esto se puede reemplazar por $NF: givingdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond
2

¿Quizás le gustaría saber cuál es la ruta al adaptador serie USB que se conectó por última vez?

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

Suponiendo que sabe cuál es el dispositivo que conectó, en Ubuntu 14.04, al menos, existe el comando usb-devicesque puede consultar y encontrar la información:

$ 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

Y la primera línea enumera el bus y el puerto, así como el número de dispositivo que lsusbproporciona.

Gertlex
fuente
Esta es la respuesta correcta, no estoy seguro de por qué no tiene más votos. El resto es un desastre de awk, etc.
Eric Drechsel
2
esto no muestra el /dev/*camino
xinthose