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 -“?