Tengo una pregunta con respecto a 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:
[[email protected] ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
¿Hay algún comando que me diga 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:
[[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
En la última línea se puede ver que mi dispositivo está conectado a /dev/ttyUSB0 .
Respuesta aceptada:
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 una secuencia de comandos rápida y sucia que recorre los dispositivos en /sys
buscando dispositivos USB con un ID_SERIAL
atributo. 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/"* ]] && exit
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && exit
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
Dispositivos que aparecen en /dev
tener un dev
archivo en su /sys
directorio. Así que buscamos directorios que coincidan con este criterio.
syspath="${sysdevpath%/dev}"
Queremos la ruta del directorio, así que quitamos /dev
.
devname="$(udevadm info -q name -p $syspath)"
Esto nos da la ruta en /dev
que corresponde a este /sys
dispositivo.
[[ "$devname" == "bus/"* ]] && exit
Esto filtra cosas que no son dispositivos reales. De lo contrario, obtendrá cosas como controladores y concentradores USB. La exit
sale de la subcapa, que fluye a la siguiente iteración del ciclo.
eval "$(udevadm info -q property --export -p $syspath)"
La propiedad udevadm info -q property --export
El comando enumera todas las propiedades del dispositivo en un formato que el shell puede analizar en variables. Así que simplemente llamamos a eval
en este. Esta es también la razón por la que envolvemos el código entre paréntesis, de modo que usamos una subcapa y las variables se borran en cada ciclo.
[[ -z "$ID_SERIAL" ]] && exit
Más filtrado de cosas que no son dispositivos reales.
echo "/dev/$devname - $ID_SERIAL"
Espero que sepas lo que hace esta línea 🙂
Relacionado:¿Cómo registrar comandos dentro de un "sudo su -"?