![장치 포트를 확인하는 명령(예: /dev/ttyUSB0)](https://linux55.com/image/39665/%EC%9E%A5%EC%B9%98%20%ED%8F%AC%ED%8A%B8%EB%A5%BC%20%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94%20%EB%AA%85%EB%A0%B9(%EC%98%88%3A%20%2Fdev%2FttyUSB0).png)
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.
답변1
당신이 무엇을 요구하는지 잘 모르겠습니다. "포트"를 여러 번 언급하셨는데, 귀하의 예에서는 /dev/ttyUSB0
포트가 아니라 장치 개발 경로라고 대답하셨습니다 . 따라서 이 답변은 각 장치의 개발 경로를 찾는 것입니다.
다음은 속성이 있는 USB 장치를 /sys
찾는 장치를 반복하는 빠르고 더러운 스크립트입니다 . 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/"* ]] && exit
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && exit
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/"* ]] && exit
이렇게 하면 실제 장치가 아닌 항목이 필터링됩니다. 그렇지 않으면 USB 컨트롤러 및 허브와 같은 것을 얻을 수 있습니다. 서브쉘을 종료 exit
하고 루프의 다음 반복을 시작하십시오.
eval "$(udevadm info -q property --export -p $syspath)"
이 udevadm info -q property --export
명령은 셸이 변수로 구문 분석할 수 있는 형식으로 모든 장치 속성을 나열합니다. 그래서 우리는 eval
그것을 요구하고 있습니다. 이것이 바로 코드를 괄호로 묶어 서브쉘을 사용하고 루프를 통과할 때마다 변수가 지워지는 이유이기도 합니다.
[[ -z "$ID_SERIAL" ]] && exit
실제 장치가 아닌 항목에 대한 추가 필터링.
echo "/dev/$devname - $ID_SERIAL"
이 줄이 무엇을 하는지 알기를 바랍니다 :-)
답변2
다음 장치에 연결되어 있는 경우 이 명령을 사용하여 장치를 탐색할 수 있습니다 usb0
.
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
답변3
적어도 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
첫 번째 줄에는 주어진 장치 번호 와 함께 버스 및 포트가 나열됩니다 .
답변4
udevadm
임베디드 Linux 시스템에서는 사용할 수 없는 추가 프로그램 없이도 sysfs에서 모든 정보를 얻을 수 있습니다 .
vidpid_to_devs(){
find $(grep -l "PRODUCT=$(printf "%x/%x" "0x${1%:*}" "0x${1#*:}")" \
/sys/bus/usb/devices/[0-9]*:*/uevent | sed 's,uevent$,,') \
/dev/null -name dev -o -name dev_id |
sed 's,[^/]*$,uevent,' |
xargs sed -n -e s,DEVNAME=,/dev/,p -e s,INTERFACE=,,p
}
% vidpid_to_devs 067b:2303
/dev/ttyUSB0
% vidpid_to_devs 00da:8510
/dev/input/event6
/dev/input/event4
/dev/input/mouse1
/dev/input/event5
/dev/hidraw3
/dev/input/event7
/dev/hidraw4
프로그램은
/sys/bus/usb/devices/*:*
a) 튜플과 일치하는 장치 인터페이스를 찾습니다 vendor:product
. uevent
해당 디렉터리의 파일에는 PRODUCT=vendor/product/revision
(모두 16진수로 되어 있고 앞에 0이 없음)이 포함되어 있습니다.
b) 파일이 포함된 하위 디렉터리를 찾고 해당 하위 디렉터리의 파일 항목에서 장치 이름을 가져옵니다 dev
. 네트워크 인터페이스와 동일합니다.DEVNAME=
uevent
dev_id
INTERFACE=