Wie schreibe ich ein Skript, das die Helligkeitsdatei in / sys / class / backlight / ideapad / bearbeitet?

Dec 19 2020

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+F1zum 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 brightnessDatei ändern oder soll ich nur die Gruppe der Datei ändern? Oder eine andere Art, die Sie sich vorstellen können?

Antworten

1 Quasímodo Dec 19 2020 at 19:30

/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.cist der Dateiname, brdie 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 -100Sie 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-backlightstatt sein ideapad.


Alternativer Ansatz

Setuid gibt brvolle Root-Rechte. Obwohl dies in diesem speziellen Programm keine Exploits auslöst, ersetzen Sie die obigen Zeilen chownund chmoddurch 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
1 ArkadiuszDrabczyk Dec 19 2020 at 00:45

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 videoGruppe 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 videoGruppe 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.