|
Не мог разобраться, что у меня на чём висит в компьютере на USB, поэтому навайбил с ГигаЧатом небольшой скриптик. В принципе, lsusb -t -v выводит эту же инфу, но на мой взгляд, менее читабельно.
#!/bin/bash
printf "%-60s %-8s %-10s %-10s %s\n" "PHYSICAL PATH" "SPEED" "VENDOR" "PRODUCT" "DEVICE NAME"
echo "------------------------------------------------------------------------------------------------------------------"
for device in /sys/bus/usb/devices/*; do
# Пропускаем служебные директории виртуальных шин без идентификаторов
if [ -e "$device/idVendor" ] && [ -e "$device/devnum" ]; then
phys_path=$(realpath $device | sed 's|.*pci||')
# Читаем скорость и сразу нормализуем её до формата lsusb
speed_raw=$(cat $device/speed 2>/dev/null)
case "$speed_raw" in
1.5) speed="1.5M" ;;
12) speed="12M" ;;
480) speed="480M" ;;
5000) speed="5000M" ;;
10000) speed="10000M" ;;
*) speed="${speed_raw:-N/A}" ;;
esac
vendor=$(<$device/idVendor 2>/dev/null)
product=$(<$device/idProduct 2>/dev/null)
# Безопасное чтение имен: если cat падает, переменная остается пустой
manufacturer=$(cat $device/manufacturer 2>/dev/null)
prod_name=$(cat $device/product 2>/dev/null)
if [ -z "$manufacturer" ] || [ -z "$prod_name" ]; then
vid_upper=$(echo "$vendor" | tr '[:lower:]' '[:upper:]')
pid_upper=$(echo "$product" | tr '[:lower:]' '[:upper:]')
if [ -n "$vid_upper" ] && [ -n "$pid_upper" ]; then
name="$vid_upper:$pid_upper"
else
name="N/A"
fi
else
# Объединяем имена, удаляя лишние пробелы и переносы строк
name="$(echo -e "${manufacturer} ${prod_name}" | xargs)"
fi
printf "%-60s %-8s %-10s %-10s %s\n" "$phys_path" "$speed" "$vendor" "$product" "$name"
fi
done | sort
Пример вывода: PHYSICAL PATH SPEED VENDOR PRODUCT DEVICE NAME ------------------------------------------------------------------------------------------------------------------ 0000:00/0000:00:01.0/0000:01:00.0/usb5 480M Linux 5.15.0-174-generic xhci-hcd xHCI Host Controller 0000:00/0000:00:01.0/0000:01:00.0/usb5/5-1 480M Generic 4-Port USB 2.0 Hub 0000:00/0000:00:01.0/0000:01:00.0/usb5/5-1/5-1.1 480M Generic 4-Port USB 2.0 Hub 0000:00/0000:00:01.0/0000:01:00.0/usb5/5-1/5-1.1/5-1.1.1 480M Webcam Webcam 0000:00/0000:00:01.0/0000:01:00.0/usb5/5-2 480M VIA Labs, Inc. USB2.0 Hub 0000:00/0000:00:01.0/0000:01:00.0/usb5/5-2/5-2.5 480M VIA Labs, Inc. USB Billboard Device 0000:00/0000:00:01.0/0000:01:00.0/usb6 10000M Linux 5.15.0-174-generic xhci-hcd xHCI Host Controller 0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1 5000M Generic 4-Port USB 3.0 Hub 0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1/6-1.1 5000M Generic 4-Port USB 3.0 Hub 0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1/6-1.1/6-1.1.4 5000M TS-RDF8 Transcend 0000:00/0000:00:01.0/0000:01:00.0/usb6/6-1/6-1.4 5000M ULT-Best Best USB Device 0000:00/0000:00:01.0/0000:01:00.0/usb6/6-2 5000M VIA Labs, Inc. USB3.1 Hub ... Это фрагмент с девайсами на одном хабе. Важно понимать, что устройства USB 2 и USB 3 сидят как бы в разных виртуальных мирах, и отображаются разных цепочках подключений. Даже если физически они воткнуты в один хаб, в системе мы видим их на разных корнях, в данном случае usb5... это USB 2, а usb6... это USB 3. Webcam и Transcend (кардридер) по факту в одном хабе рядом, но в выводе lsusb, например, кажется что они должны быть вообще на разных контроллерах.
Tags: Linux.
Archives
|
