คำสั่งเพื่อกำหนดพอร์ตของอุปกรณ์ (เช่น / dev / ttyUSB0)


46

ฉันมีคำถามเกี่ยวกับพอร์ตใน Linux หากฉันเชื่อมต่ออุปกรณ์ผ่าน USB และต้องการตรวจสอบพอร์ตฉันไม่สามารถทำได้โดยใช้คำสั่ง lsusb ซึ่งระบุหมายเลขรถบัสและหมายเลขอุปกรณ์บนรถบัสนี้เท่านั้น:

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

มีคำสั่งที่บอกพอร์ตที่อุปกรณ์เชื่อมต่อโดยตรงหรือไม่ วิธีเดียวที่จะทำเช่นนี้ได้จนถึงตอนนี้คือการแยกและเชื่อมต่อใหม่และใช้คำสั่ง:

[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

ในบรรทัดสุดท้ายก็จะเห็นได้ว่าอุปกรณ์ของฉันเชื่อมต่อกับ/ dev / ttyUSB0


คุณพยายามทำอะไรให้สำเร็จ คุณต้องการเชื่อมโยงอุปกรณ์เข้า/devกับรายการlsusbหรือไม่? หรือคุณต้องการแสดงรายการอุปกรณ์ทั้งหมด/devที่ได้มาจากอุปกรณ์ USB จริงหรือไม่? หรือคุณแค่ต้องการls /dev/ttyUSB*?
แพทริค

ฉันต้องการคำสั่งที่จะให้พอร์ตของอุปกรณ์แก่ฉันและจะไม่ผลักให้ฉันตัดการเชื่อมต่อและเชื่อมต่ออุปกรณ์ของฉันอีกครั้ง ls /dev/ttyUSB*จะแสดงรายการพอร์ตของ maybee 10 เท่านั้น แต่จากรายการนี้ฉันไม่สามารถบอกได้ว่าอันไหนที่เหมาะกับอุปกรณ์ของฉัน
71GA

ฉันพบว่าสิ่งนี้มีประโยชน์ lsusb -v
tjaart55

คำตอบ:


80

ฉันไม่แน่ใจในสิ่งที่คุณถาม คุณพูดถึง 'พอร์ต' หลายครั้ง แต่ในตัวอย่างของคุณคุณบอกว่าคำตอบคือ/dev/ttyUSB0ซึ่งเป็นเส้นทางอุปกรณ์ dev ไม่ใช่พอร์ต ดังนั้นคำตอบนี้เกี่ยวกับการค้นหาเส้นทาง dev สำหรับแต่ละอุปกรณ์

ด้านล่างนี้เป็นสคริปต์ที่รวดเร็วและสกปรกซึ่งจะตรวจสอบอุปกรณ์ต่างๆ/sysเพื่อค้นหาอุปกรณ์ USB ที่มีID_SERIALคุณสมบัติ โดยทั่วไปแล้วอุปกรณ์ USB จริงเท่านั้นที่จะมีคุณสมบัตินี้และเราสามารถกรองได้ หากเราไม่ทำเช่นนั้นคุณจะเห็นหลายสิ่งหลายอย่างในรายการที่ไม่ใช่อุปกรณ์ทางกายภาพ

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

ในระบบของฉันผลลัพธ์นี้มีดังต่อไปนี้:

/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

คำอธิบาย:

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

อุปกรณ์ที่ปรากฏขึ้น/devมีdevไฟล์ใน/sysไดเรกทอรีของพวกเขา ดังนั้นเราจึงค้นหาไดเรกทอรีที่ตรงกับเกณฑ์นี้
 

syspath="${sysdevpath%/dev}"

/devเราต้องการเส้นทางไดเรกทอรีดังนั้นเราจึงเปลื้องผ้า
 

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

สิ่งนี้ทำให้เรามีเส้นทาง/devที่สอดคล้องกับ/sysอุปกรณ์นี้
 

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

สิ่งนี้จะกรองสิ่งที่ไม่ใช่อุปกรณ์จริง ไม่เช่นนั้นคุณจะได้สิ่งต่าง ๆ เช่นตัวควบคุม USB และฮับ
 

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

udevadm info -q property --exportรายการคำสั่งทั้งหมดคุณสมบัติของอุปกรณ์ในรูปแบบที่สามารถแยกวิเคราะห์โดยเปลือกลงในตัวแปร ดังนั้นเราจึงเรียกevalสิ่งนี้ว่า นี่คือเหตุผลที่เราใส่โค้ดไว้ในวงเล็บเพื่อที่เราจะใช้ subshell และตัวแปรจะถูกลบในแต่ละลูป
 

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

กรองสิ่งต่าง ๆ ที่ไม่ใช่อุปกรณ์จริง
 

echo "/dev/$devname - $ID_SERIAL"

ฉันหวังว่าคุณจะรู้ว่าบรรทัดนี้ทำอะไร :-)


2
ขอขอบคุณ. ฉันจะเรียนรู้อะไรมากมายจากผู้ตอบคำถามของคุณและตอนนี้ฉันเห็นว่าคำศัพท์นั้นไม่ชัดเจนสำหรับฉัน มีวิธีที่สั้นกว่านี้ไหม? Maybee คำสั่งรวมอยู่ใน Linux แล้วหรือยัง
71GA

Nope หากมีคำสั่งที่มีอยู่ก่อนฉันจะแนะนำมันอย่างมีความสุข
แพทริค

แนะนำให้เปลี่ยน / bin / bash เป็น / bin / sh และลบ () เพื่อความเข้ากันได้สูงสุด
albfan

10

คุณสามารถใช้คำสั่งนี้เพื่อสำรวจอุปกรณ์ของคุณหากเชื่อมต่อกับusb0:

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

คำตอบยอดนิยมใช้ไม่ได้กับเครื่องของฉัน แต่มันใช้งานได้ดี ขอบคุณ!
johnny_boy

2

คุณสามารถลองบางอย่างเช่นนี้ด้านล่าง

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

โอ๊ยดวงตาของฉัน! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (เทียบเท่า แต่สะอาด ... แต่ก็ยังแปลกรหัส;? ทำไมไม่เพียง ttyUSB ร่วมกันและสิ่งที่เป็น 2x รอบสำหรับ)
ปีเตอร์

1
revถูกนำมาใช้เพื่อให้ข้อมูลที่ผ่านมามีการเข้าถึงนี้จะถูกแทนที่ด้วย$NF: ให้dmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
Léo GERMOND

2

บางทีคุณอาจต้องการทราบเพียงเส้นทางไปยังอะแดปเตอร์ USB-serial ที่เชื่อมต่อล่าสุด?

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

2

สมมติว่าคุณรู้ว่าอุปกรณ์ที่คุณเสียบคืออะไรใน 14.04 Ubuntu อย่างน้อยมีคำสั่งusb-devicesที่คุณสามารถค้นหาและค้นหาข้อมูล:

$ 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

และบรรทัดแรกจะแสดงรายการบัสและพอร์ตรวมถึงหมายเลขอุปกรณ์ที่lsusbให้


นี่คือคำตอบที่ถูกต้องไม่แน่ใจว่าทำไมไม่มีคะแนนเพิ่มเติม ที่เหลือคือความยุ่งเหยิงของ awk และอื่น ๆ
Eric Drechsel

1
สิ่งนี้ไม่แสดง/dev/*เส้นทาง
xinthose
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.