it-swarm.com.de

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

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

[[email protected] ~]$ 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? Bisher war dies nur durch Trennen und erneutes Verbinden und Verwenden des Befehls möglich:

[[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

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

54
71GA

Ich bin mir nicht ganz sicher, was Sie fragen. Sie erwähnen 'port' mehrmals, aber in Ihrem Beispiel sagen Sie, die Antwort lautet /dev/ttyUSB0, das ist ein Geräteentwicklungspfad, kein Port. Bei dieser Antwort geht es darum, den Entwicklungspfad für jedes Gerät zu finden.

Unten finden Sie ein schnelles und schmutziges Skript, das Geräte in /sys auf der Suche nach USB-Geräten mit einem ID_SERIAL Attribut. Normalerweise haben nur echte USB-Geräte dieses Attribut, sodass wir damit filtern können. Wenn wir dies nicht tun, 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 /dev haben eine dev Datei in ihrem /sys Verzeichnis. Deshalb suchen wir nach Verzeichnissen, die diesen Kriterien entsprechen.

syspath="${sysdevpath%/dev}"

Wir wollen den Verzeichnispfad, also entfernen wir /dev.

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

Dies gibt uns den Weg in /dev das entspricht diesem /sys Gerät.

[[ "$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)"

Das udevadm info -q property --export Befehl listet alle Geräteeigenschaften in einem Format auf, das von der Shell in Variablen analysiert werden kann. Also rufen wir einfach eval auf. Dies ist auch der Grund, warum wir den Code in Klammern setzen, sodass wir eine Unterschale 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 Linie macht :-)

84
Patrick

Mit diesem Befehl können Sie Ihr Gerät untersuchen, wenn eine Verbindung zu usb0:

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

Angenommen, Sie wissen, welches Gerät Sie angeschlossen haben, gibt es in 14.04 Ubuntu zumindest den Befehl usb-devices dass Sie durchsehen und die Informationen finden 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 sind Bus und Port sowie die Gerätenummer aufgeführt, die lsusb angibt.

5
Gertlex

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

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

Sie könnten so etwas unten versuchen.

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