장치의 포트를 결정하는 명령 (예 : / 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*거야?
Patrick

장치 포트를 제공하고 장치 연결을 끊었다가 다시 연결하라는 명령이 필요합니다. ls /dev/ttyUSB*maybee 10 포트만 나열하지만이 목록에서 내 장치에 대한 포트를 알 수 없습니다.
71GA

나는 이것이 도움이된다는 것을 알았다. lsusb -v
tjaart55

답변:


80

나는 당신이 무엇을 요구하는지 잘 모르겠습니다. 'port'를 여러 번 언급했지만 예제에서 대답은 /dev/ttyUSB0포트가 아니라 장치 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

의 표시 장치 /devdev자신의 파일 /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이것을 간단히 부릅니다 . 이것은 또한 우리가 코드를 괄호 안에 싸서 서브 쉘을 사용하고 각 루프에서 변수가 지워지는 이유이기도합니다.
 

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

실제 장치가 아닌 것들에 대한 더 많은 필터링.
 

echo "/dev/$devname - $ID_SERIAL"

나는 당신 이이 줄이 무엇인지 알기를 바랍니다 :-)


2
감사합니다. 나는 당신의 대답에서 많은 것을 배우고 이제는 용어가 나에게 완전히 명확하지 않은 것을 볼 수 있습니다. 더 짧은 방법이 있습니까? 어쩌면 리눅스 자체에 명령이 이미 통합되어 있습니까?
71GA

아니. 기존 명령이 있으면 기꺼이 권장합니다.
Patrick

/ bin / bash를 / bin / sh로 변경하고 최대 호환성을 위해 () 제거
albfan

10

다음에 연결된 경우이 명령을 사용하여 장치를 탐색 할 수 있습니다 usb0.

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

가장 좋은 대답은 내 컴퓨터에서 작동하지 않았지만 훌륭하게 작동했습니다. 감사!
johnny_boy 2016 년

2

아래에서 이와 같은 것을 시도 할 수 있습니다.

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

아야 내 눈! dmesg | awk '/tty/ && /USB/ {print "/dev/"$1}' (동일하지만 깨끗하지만 ... 여전히 이상한 코드입니다. 왜 ttyUSB를 함께 사용하지 않습니까? 2x rev는 무엇입니까?)
Peter

1
rev마지막 필드에 액세스 할 수 있도록 사용되며, 이것은로 대체 될 수있다 $NF: 제공dmesg | awk '/tty/ && /USB/ {print "/dev/"$NF}'
레우 Germond

2

아마도 마지막에 연결된 USB 직렬 어댑터의 경로 만 알고 싶습니까?

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.