Saya punya pertanyaan tentang port di Linux. Jika saya menghubungkan perangkat saya melalui USB dan ingin memeriksa portnya, saya tidak dapat melakukannya menggunakan perintah lsusb, yang hanya menentukan nomor bus dan nomor perangkat di bus ini:
[[email protected] ~]$ lsusb
Bus 003 Device 007: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Apakah ada perintah yang memberi tahu saya port yang terhubung langsung dengan perangkat? Satu-satunya cara untuk melakukan ini sampai sekarang adalah memutuskan sambungan dan menyambungkan kembali dan menggunakan perintah:
[[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
Pada baris terakhir terlihat bahwa perangkat saya terhubung ke /dev/ttyUSB0 .
Jawaban yang Diterima:
Saya tidak yakin apa yang Anda tanyakan. Anda menyebutkan 'port' beberapa kali, tetapi kemudian dalam contoh Anda, Anda mengatakan jawabannya adalah /dev/ttyUSB0
, yang merupakan jalur pengembangan perangkat, bukan port. Jadi jawaban ini adalah tentang menemukan jalur pengembangan untuk setiap perangkat.
Di bawah ini adalah skrip cepat dan kotor yang berjalan melalui perangkat di /sys
mencari perangkat USB dengan ID_SERIAL
atribut. Biasanya hanya perangkat USB asli yang memiliki atribut ini, sehingga kami dapat memfilternya. Jika tidak, Anda akan melihat banyak hal dalam daftar yang bukan perangkat fisik.
#!/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
Di sistem saya, ini menghasilkan sebagai berikut:
/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
Penjelasan:
find /sys/bus/usb/devices/usb*/ -name dev
Perangkat yang muncul di /dev
memiliki dev
file di /sys
mereka direktori. Jadi kami mencari direktori yang cocok dengan kriteria ini.
syspath="${sysdevpath%/dev}"
Kami menginginkan jalur direktori, jadi kami menghapus /dev
.
devname="$(udevadm info -q name -p $syspath)"
Ini memberi kita jalan di /dev
yang sesuai dengan /sys
ini perangkat.
[[ "$devname" == "bus/"* ]] && exit
Ini menyaring hal-hal yang bukan perangkat sebenarnya. Jika tidak, Anda akan mendapatkan hal-hal seperti pengontrol &hub USB. exit
keluar dari subkulit, yang mengalir ke iterasi loop berikutnya.
eval "$(udevadm info -q property --export -p $syspath)"
Properti udevadm info -q property --export
perintah mencantumkan semua properti perangkat dalam format yang dapat diuraikan oleh shell menjadi variabel. Jadi kita cukup memanggil eval
hal ini. Ini juga alasan mengapa kami membungkus kode dalam tanda kurung, sehingga kami menggunakan subkulit, dan variabel dihapus pada setiap loop.
[[ -z "$ID_SERIAL" ]] && exit
Lebih banyak pemfilteran hal-hal yang bukan perangkat sebenarnya.
echo "/dev/$devname - $ID_SERIAL"
Saya harap Anda tahu apa yang dilakukan baris ini
Terkait:Bagaimana cara mencatat perintah dalam "sudo su -"?