Wie schreibe ich ein Skript, das die Helligkeitsdatei in / sys / class / backlight / ideapad / bearbeitet?
Ich benutze i3 wm und habe meine Helligkeitsdatei in /sys/class/backlight/ideapad/brightness
.
╰─$ ls -la /sys/class/backlight/ideapad/
-rw-r--r-- 1 root root 4096 Dec 18 16:55 brightness
Wenn ich die Helligkeit ändern möchte (sagen wir zu 4), mache ich:
sudo sh -c "echo 4 > /sys/class/backlight/ideapad/brightness"
Ich möchte ein Skript schreiben, das die Helligkeit um 1 erhöht oder verringert und dieses Skript dann an eine Tastenkombination in der i3 wm-Konfigurationsdatei bindet ( CTRL+F1
zum Beispiel), damit ich die Helligkeit durch Drücken von Tasten steuern kann, anstatt die Helligkeitsdatei zu bearbeiten manuell jedes Mal, wenn ich die Helligkeit ändern möchte.
Da dies Root-Rechte erfordert, bin ich mir nicht sicher, wie ich das erreichen soll. Soll ich meinen Benutzer als Eigentümer der brightness
Datei ändern oder soll ich nur die Gruppe der Datei ändern? Oder eine andere Art, die Sie sich vorstellen können?
Antworten
/sysist ein RAM-basiertes virtuelles Dateisystem , sodass das Ändern der Berechtigung seiner Dateien einen Neustart nicht überlebt.
Dieses C-Programm ist die Lösung, die ich vor einiger Zeit geschrieben habe und die mich nie im Stich gelassen hat. Es erfordert nichts, was ein Standard-Linux-System nicht hat.
#include <stdlib.h>
#include <stdio.h>
#define BUFSIZE 10
int main(int argc, char **argv) {
FILE *fp;
char scurr[BUFSIZE];
long new, curr, incr, min = 10;
/* An argument with an integer increment must be supplied */
if (argc != 2 || (incr = strtol(argv[1], NULL, 10)) == 0) { return(1); }
/* Retrieve the current brightness and increment it in the brightness file */
if ((fp = fopen("/sys/class/backlight/ideapad/brightness", "r+"))
&& fgets(scurr, BUFSIZE, fp)) {
curr = strtol(scurr, NULL, 10);
rewind(fp);
new = curr + incr;
if (new < min) { new = min; }
fprintf(fp, "%ld\n", new);
fclose(fp);
} else { return(2); }
return(0);
}
Kompilieren Sie es ( br.c
ist der Dateiname, br
die ausführbare Datei), machen Sie root zum Eigentümer, aktivieren Sie das setuid-Bit und platzieren Sie die ausführbare Datei irgendwo in Ihrer PATH
( /usr/local/bin/
ist eine typische Wahl).
cc br.c -o br
chown root br
chmod u+s br
mv br /usr/local/bin/
Wenn br -100
Sie jetzt nur ausführen , wird Ihre Helligkeit um 100 verringert.
Achten Sie darauf, dass ich auch die minimale Helligkeit auf eingestellt habe min = 10
. Das ist ziemlich niedrig auf meinem Computer, dass man kaum bemerkt, dass das Display eingeschaltet ist. Passen Sie diesen Wert an Ihre Bedürfnisse an. Auch für viele Menschen wird die Pfadkomponente so etwas wie intel-backlight
statt sein ideapad
.
Alternativer Ansatz
Setuid gibt br
volle Root-Rechte. Obwohl dies in diesem speziellen Programm keine Exploits auslöst, ersetzen Sie die obigen Zeilen chown
und chmod
durch die entsprechende Funktion , wenn Sie sehr vorsichtig sein und nur die erforderlichen Berechtigungen festlegen möchten, um die Überprüfung der Dateiberechtigungen zu umgehen
setcap cap_dac_override+ep br
Das Ändern des Gruppenbesitzes ist normalerweise der richtige Weg. Beachten Sie jedoch, dass Sie dies jedes Mal nach dem Neustart tun müssen. Erstellen Sie dazu automatisch eine udev-Regel, wie im Arch-Wiki beschrieben :
Standardmäßig kann nur root die Helligkeit mit dieser Methode ändern. Damit Benutzer in der Videogruppe die Helligkeit ändern können, kann eine udev-Regel wie die folgende verwendet werden:
/etc/udev/rules.d/backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", GROUP="video", MODE="0664"
Wenn Sie kein Mitglied einer video
Gruppe sind, fügen Sie Ihren Benutzer hinzu:
sudo gpasswd video -a $(whoami)
Beachten Sie, dass Sie sich abmelden und wieder anmelden müssen, um die Informationen zur Gruppenmitgliedschaft zu aktualisieren:
su -l $(whoami)
Überprüfen Sie, ob Sie Mitglied einer video
Gruppe mit ID sind. Sie sollte Folgendes drucken:
$ id
uid=1000(ja) gid=100(users) groups=100(users),16(dialout),17(audio),18(video),83(plugdev),215(vboxusers),281(docker)
Natürlich können Sie jede Gruppe verwenden, zu der Ihr Benutzer in der udev-Regel gehört, nicht unbedingt video
.