uhubctl auf Raspberry PI Zero

Eine kleine „Console Story“ über die Installation von uhubctl auf meinem Raspberry PI Zero

  1. Installation libusb-1.0-0-dev
sudo apt-get install libusb-1.0-0-dev
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
  libusb-1.0-doc
Die folgenden NEUEN Pakete werden installiert:
  libusb-1.0-0-dev libusb-1.0-doc
0 aktualisiert, 2 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 247 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 1.731 kB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n] J
Holen:1 http://mirror.netcologne.de/raspbian/raspbian buster/main armhf libusb-1.0-0-dev armhf 2:1.0.22-2 [65,5 kB]
Holen:2 http://mirror.netcologne.de/raspbian/raspbian buster/main armhf libusb-1.0-doc all 2:1.0.22-2 [182 kB]
Es wurden 247 kB in 1 s geholt (346 kB/s).
Vormals nicht ausgewähltes Paket libusb-1.0-0-dev:armhf wird gewählt.
(Lese Datenbank ... 98616 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../libusb-1.0-0-dev_2%3a1.0.22-2_armhf.deb ...
Entpacken von libusb-1.0-0-dev:armhf (2:1.0.22-2) ...
Vormals nicht ausgewähltes Paket libusb-1.0-doc wird gewählt.
Vorbereitung zum Entpacken von .../libusb-1.0-doc_2%3a1.0.22-2_all.deb ...
Entpacken von libusb-1.0-doc (2:1.0.22-2) ...
libusb-1.0-doc (2:1.0.22-2) wird eingerichtet ...
libusb-1.0-0-dev:armhf (2:1.0.22-2) wird eingerichtet ...

2. Download uhubctl

git clone https://github.com/mvp/uhubctl
Klone nach 'uhubctl' ...
remote: Enumerating objects: 746, done.
remote: Counting objects: 100% (122/122), done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 746 (delta 71), reused 86 (delta 37), pack-reused 624
Empfange Objekte: 100% (746/746), 219.59 KiB | 515.00 KiB/s, Fertig.
Löse Unterschiede auf: 100% (456/456), Fertig.

3. uhubctl Compilieren

cd uhubctl; make
cc  -g -O0 -Wall -Wextra -std=c99 -pedantic -DPROGRAM_VERSION=\"2.4.0-16-g37f494ff\" -I/usr/include/libusb-1.0 uhubctl.c -o uhubctl -Wl,-zrelro,-znow -lusb-1.0

ls -altr
insgesamt 164
drwxr-xr-x 16 pi pi  4096 Aug 18 12:06 ..
-rw-r--r--  1 pi pi     6 Aug 18 12:06 VERSION
-rw-r--r--  1 pi pi 23285 Aug 18 12:06 README.md
-rw-r--r--  1 pi pi  1155 Aug 18 12:06 Makefile
-rw-r--r--  1 pi pi   706 Aug 18 12:06 LICENSE
-rw-r--r--  1 pi pi    64 Aug 18 12:06 .gitignore
drwxr-xr-x  2 pi pi  4096 Aug 18 12:06 Formula
-rw-r--r--  1 pi pi 18092 Aug 18 12:06 COPYING
-rw-r--r--  1 pi pi   543 Aug 18 12:06 uhubctl_git.bb
-rw-r--r--  1 pi pi 39735 Aug 18 12:06 uhubctl.c
drwxr-xr-x  8 pi pi  4096 Aug 18 12:07 .git
drwxr-xr-x  4 pi pi  4096 Aug 18 12:07 .
-rwxr-xr-x  1 pi pi 42336 Aug 18 12:07 uhubctl

4. uhubctl installieren

sudo make install
install -m 755 -d /usr/sbin
install -m 755 uhubctl /usr/sbin

5. Testen

sudo uhubctl -h
uhubctl: utility to control USB port power for smart hubs.
Usage: uhubctl [options]
Without options, show status for all smart hubs.

Options [defaults in brackets]:
--action,   -a - action to off/on/cycle/toggle (0/1/2/3) for affected ports.
--ports,    -p - ports to operate on    [all hub ports].
--location, -l - limit hub by location  [all smart hubs].
--level     -L - limit hub by location level (e.g. a-b.c is level 3).
--vendor,   -n - limit hub by vendor id [any] (partial ok).
--search,   -s - limit hub by attached device description.
--delay,    -d - delay for cycle action [2 sec].
--repeat,   -r - repeat power off count [1] (some devices need it to turn off).
--exact,    -e - exact location (no USB3 duality handling).
--force,    -f - force operation even on unsupported hubs.
--reset,    -R - reset hub after each power-on action, causing all devices to reassociate.
--wait,     -w - wait before repeat power off [20 ms].
--version,  -v - print program version.
--help,     -h - print this text.

Send bugs and requests to: https://github.com/mvp/uhubctl
version: 2.4.0-16-g37f494ff

sudo uhubctl
Current status for hub 1 [1d6b:0002 Linux 5.10.17+ dwc_otg_hcd DWC OTG Controller 20980000.usb, USB 2.00, 1 ports, ppps]
  Port 1: 0503 power highspeed enable connect [1a40:0101 USB 2.0 Hub, USB 2.00, 4 ports, ganged]

6. Optional Setuid

Setuid (Set User ID, manchmal auch suid) ist ein erweitertes Unix-Dateirecht für Dateien oder Verzeichnisse des Unix-Betriebssystems. Ausführbare Programme, bei denen dieses Bit gesetzt ist, werden zusätzlich zu den Rechten desjenigen Benutzers, der die Datei ausführt, auch mit den Rechten des Benutzers ausgeführt, dem die Datei gehört (das heißt mit den Rechten des Besitzers der Datei, des „Owners“). Auf den meisten Systemen funktioniert dies nur für ausführbare Binärdateien, nicht jedoch für interpretierte Scripts. Dieses Vorgehen ermöglicht unprivilegierten Benutzern und Prozessen einen kontrollierten Zugriff auf privilegierte Ressourcen.

https://de.wikipedia.org/wiki/Setuid

Durch das S-Bit ist es möglich, uhubctl ohne sudo aufzurufen.

sudo chmod u+s  /usr/sbin/uhubctl

Done