GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

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 -“?
Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  3. Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

  4. Wie Linux /dev/tty und /dev/tty0 verwendet

  5. Ist es falsch, /dev/random unter Linux mit /dev/urandom zu verknüpfen?

tty (/dev/tty ) vs. pts (/dev/pts) unter Linux

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

Kernel:/dev/kmem und /dev/mem deaktivieren

Wofür wird `/dev/console` verwendet?

Erstellen Sie ein virtuelles Blockgerät, das in /dev/null schreibt

Unterschiede zwischen /dev/sda und /dev/sda1