GNU/Linux >> Tutoriales Linux >  >> Linux

¿Comando para determinar los puertos de un dispositivo (como /dev/ttyusb0)?

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 -"?
Linux
  1. Linux:¿Diferencia entre /dev/console, /dev/tty y /dev/tty0?

  2. ¿Cuándo usar /dev/random Vs /dev/urandom?

  3. Linux – /dev/xvde1?

  4. ¿Cómo codificar en base64 /dev/random o /dev/urandom?

  5. ¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

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

kernel:deshabilitar /dev/kmem y /dev/mem

¿Está mal vincular /dev/random a /dev/urandom en Linux?

¿Para qué se usa `/dev/console`?

Crear un dispositivo de bloque virtual que escriba en /dev/null

Diferencias entre /dev/sda y /dev/sda1