polecenie określające porty urządzenia (jak / dev / ttyUSB0)


46

Mam pytanie dotyczące portów w systemie Linux. Jeśli podłączę urządzenie przez USB i chcę sprawdzić jego port, nie mogę tego zrobić za pomocą polecenia lsusb, który określa tylko numer magistrali i numer urządzenia na tej magistrali:

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

Czy istnieje polecenie, które mówi mi port, do którego urządzenie jest podłączone bezpośrednio? Jedynym sposobem na zrobienie tego do tej pory było rozłączenie i ponowne połączenie oraz użycie polecenia:

[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

W ostatnim wierszu widać, że moje urządzenie jest podłączone do / dev / ttyUSB0 .


Co próbujesz osiągnąć Czy chcesz powiązać urządzenie /devz wpisem lsusb? A może chcesz wymienić wszystkie urządzenia /dev, które pochodzą z fizycznego urządzenia USB? A może po prostu chcesz ls /dev/ttyUSB*?
Patrick

Potrzebuję tylko polecenia, które da mi port urządzenia i nie będzie zmuszało mnie do rozłączania i ponownego podłączania urządzeń. ls /dev/ttyUSB*wyświetli tylko 10 portów Maybee, ale z tej listy nie wiem, który jest przeznaczony dla mojego urządzenia.
71GA

Uznałem to za pomocne. lsusb -v
tjaart55

Odpowiedzi:


80

Nie jestem do końca pewien, o co pytasz. Wspominasz „port” kilka razy, ale w swoim przykładzie mówisz, że odpowiedź brzmi: /dev/ttyUSB0ścieżka urządzenia, a nie port. Więc ta odpowiedź dotyczy znalezienia ścieżki dla każdego urządzenia.

Poniżej znajduje się szybki i brudny skrypt, który przegląda urządzenia w /sysposzukiwaniu urządzeń USB z ID_SERIALatrybutem. Zwykle tylko prawdziwe urządzenia USB będą miały ten atrybut, więc możemy go filtrować. Jeśli nie, zobaczysz na liście wiele rzeczy, które nie są urządzeniami fizycznymi.

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

W moim systemie powoduje to:

/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

Wyjaśnienie:

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

Urządzenia, które się pojawią, /devmają devplik w swoim /syskatalogu. Szukamy więc katalogów spełniających te kryteria.
 

syspath="${sysdevpath%/dev}"

Chcemy ścieżki katalogu, więc usuwamy się /dev.
 

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

To daje nam ścieżkę, /devktóra odpowiada temu /sysurządzeniu.
 

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

To odfiltrowuje rzeczy, które nie są rzeczywistymi urządzeniami. W przeciwnym razie dostaniesz takie rzeczy jak kontrolery i huby USB.
 

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

W udevadm info -q property --exportlistuje wszystkie właściwości urządzenia w formacie, który może być analizowany przez powłokę do zmiennych. Po prostu wzywamy evalto. Jest to również powód, dla którego zawijamy kod w nawiasie, abyśmy używali podpowłoki, a zmienne są usuwane w każdej pętli.
 

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

Więcej filtrowania rzeczy, które nie są rzeczywistymi urządzeniami.
 

echo "/dev/$devname - $ID_SERIAL"

Mam nadzieję, że wiesz, co robi ta linia :-)


2
Dziękuję Ci. Wiele się nauczę od twojej odpowiedzi i teraz widzę, że warunki nie były dla mnie całkowicie jasne. Czy jest jakaś krótsza droga? Czy Maybee jest już poleceniem zintegrowanym z samym Linuksem?
71GA

Nie. Gdyby istniało wcześniej istniejące polecenie, chętnie je poleciłbym.
Patrick,

Zaproponuj zmianę / bin / bash na / bin / sh i usunięcie () w celu zapewnienia maksymalnej kompatybilności
albfan

10

Możesz użyć tego polecenia, aby eksplorować urządzenie, jeśli jest podłączone do usb0:

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

Najlepsza odpowiedź nie działała na moim komputerze, ale zadziałało świetnie. Dzięki!
johnny_boy,

2

Możesz spróbować czegoś takiego poniżej.

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

ow oczy! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Równoważny, ale czysty ... ale wciąż dziwny kod; dlaczego nie po prostu razem ttyUSB? I po co było 2x rev?)
Peter

1
revSłuży więc ostatnie pole jest dostępne, to może być zastąpiony przez $NF: dającdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond

2

Być może chciałbyś poznać ścieżkę do adaptera szeregowego USB, który został podłączony jako ostatni?

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

2

Zakładając, że wiesz, jakie urządzenie jest podłączone, przynajmniej w 14.04 Ubuntu istnieje polecenie usb-devices, przez które możesz przejrzeć i znaleźć informacje:

$ 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

Pierwsza linia zawiera listę magistrali i portu, a także numer lsusbpodanego urządzenia .


To poprawna odpowiedź, nie jestem pewien, dlaczego nie ma więcej głosów. Reszta to bałagan awk itp.
Eric Drechsel

1
to nie pokazuje /dev/*ścieżki
xinthose
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.