Bir cihazın portlarını belirleme komutu (/ dev / ttyUSB0 gibi)


46

Linux'taki portlarla ilgili bir sorum var. Cihazımı USB üzerinden bağlarsam ve portunu kontrol etmek istersem, sadece bu veri yolu üzerindeki veri yolu numarasını ve telefon numarasını belirten lsusb komutunu kullanarak yapamam:

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

Bana cihazın doğrudan bağlı olduğu portu söyleyen bir komut var mı? Bunu şimdiye kadar yapmanın tek yolu, komutunu kaldırmak ve yeniden bağlamak ve komutu kullanmaktı:

[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

Son satırda cihazımın / dev / ttyUSB0 cihazına bağlı olduğu görülebilir .


Ne yapmaya çalışıyorsun? Bir cihazı /devbir girişi ile ilişkilendirmek ister misiniz lsusb? Veya /devfiziksel bir USB cihazından türetilen tüm cihazları listelemek mi istiyorsunuz ? Yoksa sadece istiyor ls /dev/ttyUSB*musun?
Patrick,

Sadece bana bir cihazın portunu verecek ve beni cihazlarımın bağlantısını kesmek ve tekrar bağlamak için zorlamayacak bir komuta ihtiyacım var. ls /dev/ttyUSB*sadece maybee 10 port listelenecek ama bu listeden hangisinin cihazım için olduğunu söyleyemem.
71GA,

Bunu faydalı buldum. lsusb -v
tjaart55

Yanıtlar:


80

Ne istediğinden emin değilim. Birkaç kez 'port' den bahsediyorsunuz, ama sonra örneğinizde, cevabın /dev/ttyUSB0bir cihaz değil, bir port olduğunu söylersiniz . Yani bu cevap her cihaz için dev yolunu bulma ile ilgili.

Aşağıda, özniteliğe /syssahip USB aygıtları ararken aygıtlar arasında dolaşan hızlı ve kirli bir komut dosyası verilmiştir ID_SERIAL. Genellikle yalnızca gerçek USB aygıtları bu özniteliğe sahip olur ve bu nedenle onunla filtreleme yapabiliriz. Bunu yapmazsak, listede fiziksel olmayan bir çok şey görürsünüz.

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

Sistemimde bu, aşağıdakilerle sonuçlanır:

/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

Açıklama:

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

Ortaya çıkan cihazların dizininde /devbir devdosya var /sys. Bu yüzden bu kriterlere uyan dizinleri ararız.
 

syspath="${sysdevpath%/dev}"

Dizin yolunu istiyoruz, o yüzden ayrılıyoruz /dev.
 

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

Bu bize /devbu /syscihaza karşılık gelen yolu verir .
 

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

Bu, gerçek cihaz olmayan şeyleri filtreler. Aksi takdirde, USB denetleyicileri ve hub'ları gibi şeyler alırsınız.
 

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

udevadm info -q property --exportKomut listesi değişkenlere kabuk tarafından çözümlenen bir biçimde tüm cihaz özellikleri. Yani biz sadece buna çağrı eval. Bu ayrıca kodu parantez içine almamızın, alt kabuk kullanmamızın ve değişkenlerin her döngüde silinmesinin nedeni de budur.
 

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

Gerçek cihaz olmayan şeylere daha fazla filtre uygulamak.
 

echo "/dev/$devname - $ID_SERIAL"

Umarım bu çizginin ne yaptığını biliyorsundur :-)


2
Teşekkür ederim. Cevaplamanızdan çok şey öğreneceğim ve şimdi bu terimlerin benim için tamamen açık olduğunu görüyorum. Daha kısa bir yolu var mı? Maybee zaten Linux'un içine entegre edilmiş bir komut mu?
71GA,

Hayır! Önceden var olan bir komut olsaydı, mutlu bir şekilde öneririm.
Patrick

/ Bin / bash değerini / bin / sh olarak değiştirmeyi ve () uyumunu maks. Uyumluluk için çıkarmayı
önerin

10

Bağlıysa, cihazınızı keşfetmek için bu komutu kullanabilirsiniz usb0:

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

En iyi cevap makinemde işe yaramadı, ama bu harika oldu. Teşekkürler!
johnny_boy

2

Aşağıdaki gibi bir şey deneyebilirsiniz.

echo -n "/dev/"; dmesg | grep tty|grep USB|rev|awk '{print $1}'|rev

gözlerimden defol! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (Eşdeğer ama temiz ... ama yine de garip bir kod;?? Neden sadece ttyUSB birlikte ve için 2x devir neydi)
Peter

1
revSon alan erişildiğinde böylece kullanılır, bu ile değiştirilebilir $NF: vererekdmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo Germond

2

Belki de en son bağlanan USB seri adaptöre giden yolu bilmek istersiniz?

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

2

Taktığınız cihazın ne olduğunu bildiğinizi varsayarsak, 14.04 Ubuntu'da, en azından, içine usb-devicesbakıp bilgileri bulabileceğiniz bir komut vardır:

$ 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

İlk satırda veri yolu ve port ile birlikte verilen cihaz numarası listelenir lsusb.


Doğru cevap, neden daha fazla oy kullanmadığından emin değil. Gerisi awk vs.'nin karmaşasıdır.
Eric Drechsel

1
bu /dev/*yolu göstermiyor
xinthose
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.