perintah untuk menentukan port perangkat (seperti / dev / ttyUSB0)

47

Saya punya pertanyaan tentang port di Linux. Jika saya menghubungkan perangkat saya melalui USB dan ingin memeriksa port-nya, saya tidak dapat melakukannya dengan menggunakan perintah lsusb, yang hanya menentukan nomor bus dan nomor perangkat di bus ini:

[ziga@Ziga-PC ~]$ 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 dengan perangkat secara langsung? Satu-satunya cara untuk melakukan ini sampai sekarang adalah dengan memutus dan menghubungkan kembali dan menggunakan perintah:

[ziga@Ziga-PC ~]$ 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 dapat dilihat bahwa perangkat saya terhubung ke / dev / ttyUSB0 .

71GA
sumber
Apa yang ingin Anda capai? Apakah Anda ingin mengaitkan perangkat /devdengan entri di lsusb? Atau Anda ingin membuat daftar semua perangkat /devyang berasal dari perangkat USB fisik? Atau Anda hanya ingin ls /dev/ttyUSB*?
Patrick
Saya hanya perlu perintah yang akan memberi saya port perangkat dan tidak akan mendorong saya untuk memutuskan dan menghubungkan kembali perangkat saya. ls /dev/ttyUSB*hanya akan mencantumkan maybee 10 port tetapi dari daftar ini saya tidak bisa membedakan mana yang untuk perangkat saya.
71GA
Saya menemukan ini sangat membantu. lsusb -v
tjaart55

Jawaban:

81

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 dev perangkat, bukan port. Jadi jawaban ini adalah tentang menemukan jalur dev untuk setiap perangkat.

Di bawah ini adalah skrip cepat dan kotor yang berjalan di perangkat /sysmencari perangkat USB dengan ID_SERIALatribut. Biasanya hanya perangkat USB nyata yang akan 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/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        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 /devmemiliki devfile di /sysdirektori mereka . Jadi kami mencari direktori yang cocok dengan kriteria ini.
 

syspath="${sysdevpath%/dev}"

Kami ingin jalur direktori, jadi kami menanggalkannya /dev.
 

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

Ini memberi kita jalan /devyang sesuai dengan /sysperangkat ini .
 

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

Ini menyaring hal-hal yang bukan perangkat yang sebenarnya. Kalau tidak, Anda akan mendapatkan hal-hal seperti pengontrol & hub USB.
 

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

The udevadm info -q property --exportperintah daftar semua properti perangkat dalam format yang bisa diurai oleh shell ke dalam variabel. Jadi kami hanya memanggil evalini. Ini juga merupakan alasan mengapa kita membungkus kode dalam tanda kurung, sehingga kita menggunakan subkulit, dan variabel bisa dihapus pada setiap loop.
 

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

Lebih banyak pemfilteran hal-hal yang bukan perangkat yang sebenarnya.
 

echo "/dev/$devname - $ID_SERIAL"

Saya harap Anda tahu apa yang dilakukan baris ini :-)

Patrick
sumber
2
Terima kasih. Saya akan belajar banyak dari server Anda dan sekarang saya melihat istilah itu tidak sepenuhnya jelas bagi saya. Apakah ada cara yang lebih pendek? Maybee perintah sudah terintegrasi di Linux itu sendiri?
71GA
Nggak. Jika ada perintah yang sudah ada sebelumnya, saya akan dengan senang hati merekomendasikannya.
Patrick
Sarankan untuk mengubah / bin / bash ke / bin / sh dan menghapus () untuk kompatibilitas maks
albfan
10

Anda dapat menggunakan perintah ini untuk menjelajahi perangkat Anda jika terhubung ke usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)
Naveen
sumber
Jawaban teratas tidak berfungsi pada mesin saya, tetapi ini berhasil. Terima kasih!
johnny_boy
2

Anda dapat mencoba sesuatu seperti ini di bawah ini.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev
VeggieVampire
sumber
ow mataku! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Setara tapi bersih ... tapi kode masih aneh; mengapa tidak hanya ttyUSB bersama? Dan untuk apa 2x?)
Peter
1
Ini revdigunakan sehingga bidang terakhir diakses, ini dapat diganti dengan $NF: pemberiandmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond
2

Mungkin Anda hanya ingin tahu jalur adaptor serial USB yang terhubung terakhir?

dmesg | awk '/tty/ && /USB/ {print "/dev/"$10}'|tail -1
HRmeteohub
sumber
2

Dengan asumsi Anda tahu perangkat apa usb-devicesyang Anda gunakan , di Ubuntu 14,04, setidaknya, ada perintah yang dapat Anda telusuri dan temukan informasinya:

$ usb-devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 3
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev=04.04
S:  Manufacturer=Linux 4.4.0-131-generic ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=0000:00:1a.0
C:  #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub

Dan baris pertama mencantumkan bus dan port, serta nomor perangkat yang lsusbmemberi.

Gertlex
sumber
Ini adalah jawaban yang benar, tidak yakin mengapa tidak memiliki lebih banyak suara. Sisanya adalah kekacauan awk dll.
Eric Drechsel
2
ini tidak menunjukkan /dev/*jalan
xinthose