Befehl zum Ermitteln der Ports eines Geräts (wie / dev / ttyUSB0)

46

Ich habe eine Frage zu den Ports in Linux. Wenn ich mein Gerät über USB anschließe und dessen Anschluss überprüfen möchte, kann ich den Befehl lsusb nicht verwenden, der nur die Busnummer und die Gerätenummer auf diesem Bus angibt:

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

Gibt es einen Befehl, der mir sagt, an welchen Port das Gerät direkt angeschlossen ist? Die einzige Möglichkeit, dies zu tun, bestand darin, die Verbindung zu trennen, die Verbindung wiederherzustellen und den Befehl zu verwenden:

[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

In der letzten Zeile ist zu sehen, dass mein Gerät mit / dev / ttyUSB0 verbunden ist .

71GA
quelle
Was versuchst du zu erreichen? Möchten Sie ein Gerät /devmit einem Eintrag in verknüpfen lsusb? Oder möchten Sie alle Geräte auflisten /dev, die von einem physischen USB-Gerät abgeleitet sind? Oder willst du nur ls /dev/ttyUSB*?
Patrick
Ich brauche nur einen Befehl, der mir den Port eines Geräts gibt und mich nicht dazu drängt, meine Geräte zu trennen und erneut zu verbinden. ls /dev/ttyUSB*liste nur 10 Ports auf, aber aus dieser Liste kann ich nicht sagen, welcher für mein Gerät ist.
71GA
Ich fand das hilfreich. lsusb -v
tjaart55

Antworten:

80

Ich bin nicht ganz sicher, was Sie fragen. Sie erwähnen 'port' mehrmals, aber dann sagen Sie in Ihrem Beispiel, dass die Antwort ist /dev/ttyUSB0, dass es sich um einen Geräteentwicklungspfad handelt, nicht um einen Port. Bei dieser Antwort geht es also darum, den Entwicklerpfad für jedes Gerät zu ermitteln.

Im Folgenden finden Sie ein schnelles und unsauberes Skript, das Geräte /sysnach USB-Geräten mit einem ID_SERIALAttribut durchsucht. In der Regel haben nur echte USB-Geräte dieses Attribut, sodass wir damit filtern können. Andernfalls werden in der Liste viele Dinge angezeigt, die keine physischen Geräte sind.

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

Auf meinem System führt dies zu folgenden Ergebnissen:

/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

Erläuterung:

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

Geräte, die in angezeigt werden, /devhaben eine devDatei in ihrem /sysVerzeichnis. Also suchen wir nach Verzeichnissen, die diesen Kriterien entsprechen.
 

syspath="${sysdevpath%/dev}"

Wir wollen den Verzeichnispfad, also streifen wir ab /dev.
 

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

Dies gibt uns den Pfad an /dev, der diesem /sysGerät entspricht.
 

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

Dies filtert Dinge heraus, die keine tatsächlichen Geräte sind. Andernfalls erhalten Sie Dinge wie USB-Controller und Hubs.
 

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

Der udevadm info -q property --exportBefehl listet alle Geräteeigenschaften in einem Format auf, das von der Shell in Variablen zerlegt werden kann. Also rufen wir einfach dazu evalauf. Dies ist auch der Grund, warum wir den Code in Klammern setzen, sodass wir eine Subshell verwenden und die Variablen in jeder Schleife gelöscht werden.
 

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

Mehr Filterung von Dingen, die keine tatsächlichen Geräte sind.
 

echo "/dev/$devname - $ID_SERIAL"

Ich hoffe du weißt was diese Zeile macht :-)

Patrick
quelle
2
Danke. Ich werde viel von Ihrer Antwort lernen und jetzt sehe ich, dass mir die Begriffe nicht völlig klar waren. Gibt es einen kürzeren Weg? Maybee ein Befehl bereits in Linux selbst integriert?
71GA
Nee. Wenn es bereits einen Befehl gab, würde ich ihn gerne weiterempfehlen.
Patrick
Schlagen Sie vor, / bin / bash in / bin / sh zu ändern und das () aus
Gründen der
10

Mit diesem Befehl können Sie Ihr Gerät durchsuchen, wenn Sie verbunden sind mit usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
Naveen
quelle
Die beste Antwort hat auf meinem Computer nicht funktioniert, aber das hat großartig funktioniert. Vielen Dank!
Johnny_boy
2

Sie könnten so etwas unten ausprobieren.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
VeggieVampire
quelle
Was für Augen! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Das Äquivalent, aber sauber ... aber immer noch seltsamer Code; warum nicht einfach ttyUSB zusammen? Und wofür war 2x rev?)
Peter
1
Das revwird verwendet, damit auf das letzte Feld zugegriffen wird. Dies kann ersetzt werden durch $NF: givingdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond
2

Vielleicht möchten Sie nur den Pfad zum zuletzt angeschlossenen USB-Seriell-Adapter kennen?

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

Unter der Annahme, dass Sie wissen, welches Gerät Sie angeschlossen haben, gibt es in Ubuntu 14.04 zumindest den Befehl usb-devices, den Sie durchsehen und nach Informationen suchen können:

$ 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

In der ersten Zeile werden Bus und Port sowie die angegebene Gerätenummer aufgelistet lsusb.

Gertlex
quelle
Dies ist die richtige Antwort, nicht sicher, warum es nicht mehr Stimmen hat. Der Rest sind Verwirrungen von awk etc.
Eric Drechsel
1
dies zeigt nicht den /dev/*Weg
Xinthose