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 .

71GA
fonte
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 :-)

Patrick
fonte
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)
Naveen
fonte
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
VeggieVampire
fonte
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
HRmeteohub
fonte
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.

Gertlex
fonte
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