comando para determinar as portas de um dispositivo (como / dev / ttyUSB0)


47

Eu tenho uma pergunta sobre as portas no Linux. Se eu conectar meu dispositivo via USB e quiser verificar sua porta, não posso fazê-lo usando o comando lsusb, que especifica apenas o número do barramento e o número do dispositivo neste barramento:

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

Existe um comando que me diz a porta à qual o dispositivo está conectado diretamente? A única maneira de fazer isso até agora era desconectar, reconectar e usar o 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

Na última linha, pode-se ver que meu dispositivo está conectado a / dev / ttyUSB0 .


O que você está tentando realizar? Deseja associar um dispositivo /deva uma entrada lsusb? Ou você deseja listar todos os dispositivos /devderivados de um dispositivo USB físico? Ou você está apenas querendo ls /dev/ttyUSB*?
— 11114 Patrick

Eu só preciso de um comando que me dê a porta de um dispositivo e não me force a desconectar e reconectar meus dispositivos. ls /dev/ttyUSB*listarei apenas 10 portas, mas talvez desta lista eu não saiba qual é o meu dispositivo.
— 71

Achei isso útil. lsusb -v
— tjaart55 27/03

Respostas:


81

Não tenho muita certeza do que você está perguntando. Você menciona 'porta' várias vezes, mas, em seu exemplo, diz que a resposta é /dev/ttyUSB0: que é um caminho de desenvolvimento do dispositivo, não uma porta. Portanto, esta resposta é sobre encontrar o caminho do desenvolvedor para cada dispositivo.

Abaixo está um script rápido e sujo que percorre dispositivos na /sysprocura de dispositivos USB com um ID_SERIALatributo. Normalmente, apenas dispositivos USB reais terão esse atributo e, portanto, podemos filtrar com ele. Caso contrário, você verá muitas coisas na lista que não são 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

No meu sistema, isso resulta no seguinte:

/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

Explicação:

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

Os dispositivos que aparecem /devtêm um devarquivo em seu /sysdiretório. Então, procuramos por diretórios que correspondam a esse critério.
 

syspath="${sysdevpath%/dev}"

Queremos o caminho do diretório, então removemos /dev.
 

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

Isso nos dá o caminho /devque corresponde a este /sysdispositivo.
 

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

Isso filtra coisas que não são dispositivos reais. Caso contrário, você terá coisas como controladores e hubs USB.
 

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

O udevadm info -q property --exportcomando lista todas as propriedades do dispositivo em um formato que pode ser analisado pelo shell em variáveis. Então, simplesmente chamamos evalisso. Essa também é a razão pela qual colocamos o código entre parênteses, para usar um subshell e as variáveis ​​são apagadas em cada loop.
 

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

Mais filtragem de coisas que não são dispositivos reais.
 

echo "/dev/$devname - $ID_SERIAL"

Espero que você saiba o que essa linha faz :-)


2
Obrigado. Vou aprender muito com sua resposta e agora vejo que os termos não foram completamente claros para mim. Existe alguma maneira mais curta? Pode haver um comando já integrado no próprio Linux?
— 71

Não. Se houvesse um comando preexistente, eu o recomendaria com prazer.
— 187 Patrick Patrick

Sugira alterar / bin / bash para / bin / sh e remova o () para compatibilidade máxima
— albfan

10

Você pode usar este comando para explorar seu dispositivo se estiver conectado a usb0:

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

A resposta principal não funcionou na minha máquina, mas funcionou muito bem. Obrigado!
— johnny_boy

2

Você pode tentar algo como isto abaixo.

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

ow meus olhos! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (O código equivalente mas limpo ... mas ainda estranho,? Porque não basta ttyUSB juntos eo que foi 2x rev para)
— Peter

1
O revé usado para que o último campo seja acessado, e pode ser substituído por $NF: givingdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
— Léo Germond

2

Talvez você gostaria de saber exatamente o caminho para o adaptador serial USB que se conectou por último?

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

2

Supondo que você saiba qual é o dispositivo conectado, no 14.04 Ubuntu, pelo menos, existe o comando usb-devicesque você pode procurar e encontrar as informações:

$ 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 a primeira linha lista ônibus e porta, bem como o número do dispositivo lsusbfornecido.


Esta é a resposta correta, sem saber por que ela não tem mais votos. O resto são bagunças de awk etc.
— Eric Drechsel

2
isso não mostra o /dev/*caminho
— xinthose
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.