GNU/Linux >> Znalost Linux >  >> Linux

Příkaz k určení portů zařízení (jako /dev/ttyusb0)?

Mám dotaz ohledně portů v Linuxu. Pokud své zařízení připojím přes USB a chci zkontrolovat jeho port, nemohu to udělat pomocí příkazu lsusb, který specifikuje pouze číslo sběrnice a číslo zařízení na této sběrnici:

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

Existuje příkaz, který mi sděluje port, ke kterému je zařízení připojeno přímo? Jediným způsobem, jak to dosud udělat, bylo odpojit a znovu připojit a použít příkaz:

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

V posledním řádku je vidět, že moje zařízení je připojeno k /dev/ttyUSB0 .

Přijatá odpověď:

Nejsem si úplně jistý, na co se ptáš. Několikrát zmiňujete „port“, ale pak ve svém příkladu řeknete, že odpověď je /dev/ttyUSB0 , což je cesta pro vývoj zařízení, nikoli port. Takže tato odpověď je o nalezení cesty pro vývojáře pro každé zařízení.

Níže je rychlý a špinavý skript, který prochází zařízeními v /sys hledá zařízení USB s ID_SERIAL atribut. Tento atribut budou mít obvykle pouze skutečná zařízení USB, a proto s ním můžeme filtrovat. Pokud ne, uvidíte v seznamu spoustu věcí, které nejsou fyzickými zařízeními.

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

V mém systému to má za následek následující:

/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

Vysvětlení:

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

Zařízení, která se zobrazují v /dev mít dev soubor v jejich /sys adresář. Hledáme tedy adresáře odpovídající těmto kritériím.
 

syspath="${sysdevpath%/dev}"

Chceme cestu k adresáři, takže odstraníme /dev .
 

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

To nám dává cestu v /dev který odpovídá tomuto /sys zařízení.
 

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

Tím se odfiltrují věci, které nejsou skutečnými zařízeními. Jinak získáte věci jako USB řadiče a rozbočovače. exit opustí subshell, který přejde do další iterace cyklu.
 

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

udevadm info -q property --export příkaz vypíše všechny vlastnosti zařízení ve formátu, který může shell analyzovat do proměnných. Jednoduše tedy nazýváme eval Na toto. To je také důvod, proč zalamujeme kód do závorek, takže použijeme subshell a proměnné se smažou v každé smyčce.
 

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

Více filtrování věcí, které nejsou skutečnými zařízeními.
 

echo "/dev/$devname - $ID_SERIAL"

Doufám, že víte, co tato řada dělá 🙂

Související:Jak protokolovat příkazy v rámci „sudo su -“?
Linux
  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Kdy použít /dev/random vs /dev/urandom?

  1. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  2. Jak Linux používá /dev/tty a /dev/tty0

  3. echo nebo print /dev/stdin /dev/stdout /dev/stderr

  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. K čemu se používá `/dev/console`?

  3. Proč jsou < nebo > vyžadovány pro použití /dev/tcp