| # List USB Devices | |
| You are helping the user view all connected USB devices with detailed information. | |
| ## Task | |
| 1. **Basic USB device listing:** | |
| ```bash | |
| # Simple list | |
| lsusb | |
| # With tree structure showing hubs | |
| lsusb -t | |
| # Verbose output | |
| lsusb -v | less | |
| ``` | |
| 2. **Detailed information for each device:** | |
| ```bash | |
| # Iterate through all devices | |
| for device in $(lsusb | awk '{print $2":"$4}' | sed 's/:$//' | tr ':' '/'); do | |
| bus=$(echo $device | cut -d'/' -f1) | |
| dev=$(echo $device | cut -d'/' -f2) | |
| echo "=== Device: Bus $bus Device $dev ===" | |
| lsusb -v -s $bus:$dev 2>/dev/null | head -30 | |
| echo "" | |
| done | |
| ``` | |
| 3. **Show USB devices by type:** | |
| ```bash | |
| echo "=== Input Devices (Keyboards, Mice) ===" | |
| lsusb | grep -iE "keyboard|mouse|input" | |
| echo -e "\n=== Storage Devices ===" | |
| lsusb | grep -iE "storage|disk|flash|card reader" | |
| echo -e "\n=== Audio Devices ===" | |
| lsusb | grep -iE "audio|sound|headset|microphone" | |
| echo -e "\n=== Video Devices ===" | |
| lsusb | grep -iE "camera|video|webcam" | |
| echo -e "\n=== Bluetooth Adapters ===" | |
| lsusb | grep -i bluetooth | |
| echo -e "\n=== Network Adapters ===" | |
| lsusb | grep -iE "network|ethernet|wifi|802.11" | |
| ``` | |
| 4. **USB device details from sysfs:** | |
| ```bash | |
| # List all USB devices with details | |
| for dev in /sys/bus/usb/devices/*; do | |
| if [ -f "$dev/manufacturer" ] && [ -f "$dev/product" ]; then | |
| echo "Device: $(cat $dev/product 2>/dev/null)" | |
| echo "Manufacturer: $(cat $dev/manufacturer 2>/dev/null)" | |
| echo "Serial: $(cat $dev/serial 2>/dev/null)" | |
| echo "Speed: $(cat $dev/speed 2>/dev/null) Mbps" | |
| echo "---" | |
| fi | |
| done | |
| ``` | |
| 5. **USB device mount points and block devices:** | |
| ```bash | |
| # Show USB storage devices | |
| lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL | grep -i usb | |
| # USB device names in /dev | |
| ls -l /dev/sd* /dev/nvme* 2>/dev/null | grep -E "^b" | |
| # Detailed block device info | |
| lsblk -f | |
| ``` | |
| 6. **USB power consumption:** | |
| ```bash | |
| # Check power usage | |
| for device in /sys/bus/usb/devices/*/power/active_duration; do | |
| dev=$(dirname $(dirname $device)) | |
| if [ -f "$dev/product" ]; then | |
| echo "$(cat $dev/product): Power: $(cat $dev/power/level) Active: $(cat $device)ms" | |
| fi | |
| done | |
| ``` | |
| 7. **USB device speed and capabilities:** | |
| ```bash | |
| # USB version and speed | |
| for dev in /sys/bus/usb/devices/usb*; do | |
| echo "USB Bus $(basename $dev):" | |
| echo " Version: $(cat $dev/version 2>/dev/null)" | |
| echo " Speed: $(cat $dev/speed 2>/dev/null) Mbps" | |
| echo " Max Child: $(cat $dev/maxchild 2>/dev/null) ports" | |
| echo "" | |
| done | |
| ``` | |
| 8. **Create formatted device report:** | |
| ```bash | |
| cat > /tmp/usb-devices.txt << EOF | |
| USB Devices Report | |
| ================== | |
| Generated: $(date) | |
| Hostname: $(hostname) | |
| === Connected USB Devices === | |
| EOF | |
| lsusb >> /tmp/usb-devices.txt | |
| echo -e "\n=== USB Device Tree ===" >> /tmp/usb-devices.txt | |
| lsusb -t >> /tmp/usb-devices.txt | |
| echo -e "\n=== USB Storage Devices ===" >> /tmp/usb-devices.txt | |
| lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL | grep -i usb >> /tmp/usb-devices.txt | |
| echo -e "\n=== USB Device Details ===" >> /tmp/usb-devices.txt | |
| usb-devices >> /tmp/usb-devices.txt | |
| cat /tmp/usb-devices.txt | |
| ``` | |
| 9. **Check USB controller info:** | |
| ```bash | |
| # List USB controllers | |
| lspci | grep -i usb | |
| # Detailed controller info | |
| for controller in $(lspci | grep -i usb | cut -d' ' -f1); do | |
| echo "=== Controller $controller ===" | |
| lspci -v -s $controller | head -20 | |
| echo "" | |
| done | |
| ``` | |
| 10. **Monitor USB events in real-time:** | |
| ```bash | |
| # Watch for USB connect/disconnect | |
| udevadm monitor --subsystem-match=usb | |
| # Or use dmesg | |
| dmesg -w | grep -i usb | |
| ``` | |
| 11. **Check USB autosuspend settings:** | |
| ```bash | |
| # Check which devices have autosuspend enabled | |
| for dev in /sys/bus/usb/devices/*/power/control; do | |
| device=$(dirname $(dirname $dev)) | |
| if [ -f "$device/product" ]; then | |
| echo "$(cat $device/product): $(cat $dev)" | |
| fi | |
| done | |
| ``` | |
| 12. **Find USB device by vendor/product ID:** | |
| ```bash | |
| # Search by ID | |
| # Example: Find device 046d:c52b | |
| lsusb -d 046d:c52b -v | |
| # Find all devices from vendor | |
| lsusb -d 046d: # Logitech devices | |
| ``` | |
| 13. **Check USB permissions:** | |
| ```bash | |
| # Show device permissions | |
| ls -l /dev/bus/usb/*/* | head -20 | |
| # Find device files for specific bus | |
| ls -l /dev/bus/usb/001/ | |
| # Check udev rules for USB | |
| ls -l /etc/udev/rules.d/*usb* | |
| ``` | |
| ## Formatted Output | |
| Create a nice summary: | |
| ```bash | |
| cat > /tmp/usb-summary.sh << 'EOF' | |
| #!/bin/bash | |
| echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" | |
| echo "β USB Devices Summary β" | |
| echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ" | |
| echo "" | |
| echo "Total USB devices: $(lsusb | wc -l)" | |
| echo "" | |
| echo "--- By Type ---" | |
| echo "Input devices: $(lsusb | grep -ciE 'keyboard|mouse|input')" | |
| echo "Storage devices: $(lsusb | grep -ciE 'storage|disk|flash')" | |
| echo "Audio devices: $(lsusb | grep -ci audio)" | |
| echo "Video devices: $(lsusb | grep -ciE 'camera|video')" | |
| echo "Network devices: $(lsusb | grep -ciE 'network|ethernet|wifi')" | |
| echo "Bluetooth adapters: $(lsusb | grep -ci bluetooth)" | |
| echo "" | |
| echo "--- USB Controllers ---" | |
| lspci | grep -i usb | |
| echo "" | |
| echo "--- Storage Devices ---" | |
| lsblk -o NAME,SIZE,TYPE,MOUNTPOINT | grep -A 10 -E "^sd|^nvme" | |
| echo "" | |
| echo "--- Recent USB Events ---" | |
| journalctl -k --since "1 hour ago" | grep -i usb | tail -10 | |
| EOF | |
| chmod +x /tmp/usb-summary.sh | |
| bash /tmp/usb-summary.sh | |
| ``` | |
| ## Troubleshooting | |
| **Device not detected:** | |
| ```bash | |
| # Check kernel messages | |
| dmesg | grep -i usb | tail -20 | |
| # Check if ports working | |
| cat /sys/kernel/debug/usb/devices | |
| # Rescan USB bus | |
| echo 1 | sudo tee /sys/bus/pci/rescan | |
| ``` | |
| **Device keeps disconnecting:** | |
| ```bash | |
| # Disable autosuspend for problematic device | |
| # Find device path | |
| device_path=$(find /sys/bus/usb/devices/ -name "DEVICE_NAME*") | |
| # Disable autosuspend | |
| echo 'on' | sudo tee $device_path/power/control | |
| ``` | |
| **Permission denied:** | |
| ```bash | |
| # Add user to plugdev group | |
| sudo usermod -aG plugdev $USER | |
| # Create udev rule for device | |
| # /etc/udev/rules.d/50-mydevice.rules | |
| # SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", MODE="0666" | |
| ``` | |
| ## Export Device Information | |
| ```bash | |
| # Create detailed report | |
| usb-devices > ~/usb-devices-$(date +%Y%m%d).txt | |
| # Or with lsusb | |
| lsusb -v > ~/usb-devices-verbose-$(date +%Y%m%d).txt | |
| ``` | |
| ## Notes | |
| - USB 1.1: 12 Mbps (Full Speed) | |
| - USB 2.0: 480 Mbps (High Speed) | |
| - USB 3.0: 5 Gbps (SuperSpeed) | |
| - USB 3.1: 10 Gbps (SuperSpeed+) | |
| - USB 3.2: 20 Gbps | |
| - USB 4.0: 40 Gbps | |
| - Vendor ID format: `046d` (Logitech), `8086` (Intel), etc. | |
| - Product ID format: `c52b` (specific device model) | |
| - USB device path: `/dev/bus/usb/BUS/DEVICE` | |
| - Use `usbutils` package for lsusb and usb-devices commands | |