Включение/отключение питания USB-порта

Искусство написания bash скриптов. Делимся своими наработками
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1352
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Включение/отключение питания USB-порта

Сообщение ZEN » 18 фев 2013, 22:17

Предыстория следующая. Был сервер и была программа управления UPS. И была следующая ошибка
USBDEVFS_CONTROL failed cmd java rqt 128 rq 8 len 1 ret -71
в интернете можно найти информацию, что данную ошибку можно получить при не синхронизации устройства USB 2.0 с портом USB 1.0 и наоборот. Интереса ради стал вопрос как передернуть USB порт удаленно, например через ssh. Но я думаю, что данный метод можно применить и для подобных ситуаций с 3G модемами, когда модем не хочет переподключаться без физического вмешательства.

Перед тем, как создать скрипт сначала обратимся к выводу команды lsusb
Bus 003 Device 002: ID 09da:000a A4 Tech Co., Ltd Optical Mouse Opto 510D
Bus 003 Device 003: ID 0d9f:0004 Powercom Co., Ltd
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
в данном случае я красным цветом подсветил искомое устройство - UPS Powercom и самое главное что в этой строке мы должны найти это:
0d9f - id производителя
0004 - id продукта
теперь создадим скрипт и впишем в него эти значения.

Код: Выделить всё

#!/bin/bash 
vendor=0d9f
product=0004

for i in /sys/bus/usb/devices/* 
do 
    if [[ -e "$i/idVendor" ]]
    then
        vid=`cat "$i/idVendor"`
        pid=`cat "$i/idProduct"`
        if [[ ($vid == $vendor) && ($pid == $product)]]
        then
            echo -n "suspend" > "$i/power/level"
            sleep 3s;
            echo -n "on" > "$i/power/level"
            sleep 3s;
            break;
        fi
    fi
done
exit 0
как видно в коде во 2-й и 3-й строке указываются выше найденные нами из вывода lsusb ID производителя и продукта. Больше ничего менять не надо. Естественно скрипт нужно запускать с правами root
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей