Muszę napisać skrypt do ponownego uruchomienia klucza USB. Mam wszystkie narzędzia, ale nie mogę połączyć mojego / dev / ttyUSBx z fizyczną magistralą i urządzeniem. Problem polega na tym, że mam trzy klucze sprzętowe z tym samym identyfikatorem i identyfikatorem.
Jeśli zrobię lsusb, wynikiem będzie:
Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
I załączyłem to do:
/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5
Ale chcę wiedzieć, które urządzenie jest powiązane z którym urządzeniem magistrali. Na przykład muszę uzyskać następujące informacje:
/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007
Używam Ubuntu Server 10.04 i przetestowałem narzędzia:
lsusb
hal
lsmod
Ale nie mogę uzyskać związku.
Naprawdę nie ma dobrego sposobu mapowania urządzeń znakowych, takich jak
/dev/ttyUSB0
odpowiadające im urządzenia USB i numery magistrali. ALE jest to możliwe!Coś takiego może działać:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
Stamtąd otrzymasz mnóstwo informacji o urządzeniu i jego urządzeniach nadrzędnych. Teraz chodzi tylko o parsowanie tych danych, aby uzyskać to, czego chcesz. Korzystałem z tego w przeszłości:
Teraz, jeśli to nie jest kęs, nie wiem, co jest! Rozbijmy to:
udevadm info --name=/dev/ttyUSB0 --attribute-walk
- zwraca informacje o urządzeniu i jego urządzeniach nadrzędnychsed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'
- analizuje te dane i zwraca wszystkie wiersze zawierające atrybut „devnum” lub „busnum”. Zakładamy, że „busnum” jest wymienione jako pierwsze ... w takim przypadku… możemy po prostu pobrać pierwsze dwa wiersze wyniku.head -n 2
- Złap pierwsze 2 wiersze wyniku. Moglibyśmy uzyskać więcej fantazji, ale zakładamy, że „busnum” i „devnum” najbliższego rodzica zostaną wymienione jako pierwsze.awk '{$1 = sprintf("%03d", $1); print}'
- Pobiera te cyfry i uzupełnia je zerami.echo /dev/bus/usb
... - cały ten jazz jest zawarty wecho
oświadczeniu, które zastępuje nowe linie spacjami. Możesz dodać-n
do,echo
jeśli chcesz odciąć końcowy znak nowej linii.tr " " "/"
- zamień spacje na wyjściu ukośnikami do przoduSpowoduje to wyświetlenie czegoś takiego:
... którym oczywiście jest urządzenie. Jeśli chcesz, możesz łatwo wyprowadzić coś
busnum:001 devnum:011
z kilkoma poprawkami:źródło
Możesz znaleźć wszystkie informacje o węźle za pomocą poniższego polecenia:
źródło