Ich habe eine Frage zu den Ports in Linux. Wenn ich mein Gerät über USB anschließe und seinen Port ü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, mit welchem Port das Gerät direkt verbunden ist? Bisher war dies nur möglich, indem die Verbindung getrennt und wieder hergestellt und der Befehl verwendet wurde:
[[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/ttyUSB0 verbunden ist .
Akzeptierte Antwort:
Ich bin mir nicht ganz sicher, was Sie fragen. Sie erwähnen mehrmals „port“, aber dann sagen Sie in Ihrem Beispiel, dass die Antwort /dev/ttyUSB0
ist , das ist ein Geräteentwicklungspfad, kein Port. In dieser Antwort geht es also darum, den Entwicklungspfad für jedes Gerät zu finden.
Unten ist ein schnelles und schmutziges Skript, das Geräte in /sys
durchläuft Suche nach USB-Geräten mit einem ID_SERIAL
Attribut. Normalerweise haben nur echte USB-Geräte dieses Attribut, und wir können damit filtern. Wenn wir dies nicht tun, sehen Sie viele Dinge in der Liste, 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/"* ]] && exit
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && exit
echo "/dev/$devname - $ID_SERIAL"
)
done
Auf meinem System ergibt dies Folgendes:
/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
Erklärung:
find /sys/bus/usb/devices/usb*/ -name dev
Geräte, die in /dev
angezeigt werden einen dev
haben Datei in ihrem /sys
Verzeichnis. Also 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 Pfad in /dev
das entspricht diesem /sys
Gerät.
[[ "$devname" == "bus/"* ]] && exit
Dadurch werden Dinge herausgefiltert, die keine tatsächlichen Geräte sind. Andernfalls erhalten Sie Dinge wie USB-Controller und Hubs. Der exit
verlässt die Subshell, die zur nächsten Iteration der Schleife übergeht.
eval "$(udevadm info -q property --export -p $syspath)"
Die udevadm info -q property --export
Der Befehl listet alle Geräteeigenschaften in einem Format auf, das von der Shell in Variablen geparst werden kann. Also rufen wir einfach eval
auf darauf. Das ist auch der Grund, warum wir den Code in Klammern einschließen, sodass wir eine Subshell verwenden und die Variablen bei jeder Schleife gelöscht werden.
[[ -z "$ID_SERIAL" ]] && exit
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 🙂
Verwandte:Wie protokolliere ich Befehle innerhalb eines „sudo su -“?