usage: power.py [-h] [-m [MOD ...]] {cycle,off,on} id
Powers off/on usb devices by id
positional arguments:
{cycle,off,on} action to perform: power-cycle, off or on
id usb device id in the form 'idVendor:idProduct', each id is a hex number from 0 to ffff, e.g., '123:abcd'
options:
-h, --help show this help message and exit
-m [MOD ...], --mod [MOD ...]
kernel module(s) to unload before the action, and to load back after the action
Beachten Sie, dass das Skript als root ausgeführt werden muss.
Ich schrieb dieses Python-Drehbuch, nachdem ich mithilfe der Hub-Ctrg-Gabel von Yi Yu versehentlich eine Problemumgehung entdeckt hatte, um den Ethernet-Port auf meinem Razer Core X Chroma Nutzfabrik auf einem Laptop zu erstellen, in dem Arch Linux ausgeführt wird. Die Lösung bestand darin, die Ports auszusetzen, mit denen der Ethernet -Controller (intern) verbunden ist, und dann erneut einschalten. Ich wollte dies tun, ohne das Hub-Bus/-gerät zu färben, was mit hub-ctrl nicht möglich ist. Deshalb verwendete ich PyUSB, um Geräte nach Anbieter und Produkt-ID zu finden, und portierte die usb_control_msg() von hub-ctrl , um die entdeckten Geräte auszuschalten. Ich bemerkte auch, dass das Stromversand des Ethernet-Adapters eine neue Netzwerkschnittstelle namens eth0 erstellt, die den alten benannten vorhersehbar einen hängenden Toten hinterlässt. Eine Problemumgehung, die hilft, besteht darin, das Kernel-Modul ax88179_178a vor dem Stromversand zu entladen und es dann wieder zurückzuladen. Daher habe ich eine Option hinzugefügt, dies auch mit demselben Skript zu tun. Jetzt renne ich einfach
python power.py cycle 0b95:1790 -m ax88179_178a
Im System Boot und Ethernet funktioniert schließlich.
Das Skript hat die folgenden Abhängigkeiten:
libusb-1.0-0libusb-0.1-4pyusb > = 1.1.0 Aus zwei Gründen verwendet es sowohl libusb1 als auch libusb0 -Backends:
libusb0 implementiert nicht die get_parent -Methode, mit der die Hub gefunden wird, mit der ein Gerät verbunden istlibusb-0.1-4 zum Ausführen von Stromversorgungsmeldungen die gewünschten Ergebnisse. Weder libusb1 noch libusb-compat haben den Trick gemacht. libusb-1.0-0 und pyusb :
sudo pacman -Sy libusb python-pyusb
libusb-0.1-4 muss über AUR, https://aur.archlinux.org/packages/libusb0, z. B. mit yay :
yay -Sy libusb0
Neuere Ubuntu -Distributionen (zumindest ab 22.04) haben pyusb==1.2.1 im offiziellen [universe] -Recories, sodass alle Abhängigkeiten mit apt installiert werden können:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-usb
Wenn Sie eine ältere Ubuntu -Distribution ausführen, z. B. 20.04 hat pyusb==1.0.2 , können Sie pyusb von PYPI installieren:
sudo apt update
sudo apt install libusb-1.0-0 libusb-0.1-4 python3-pip
sudo python3 -m pip install pyusb