Jak napisać skrypt edytujący plik jasności w / sys / class / backlight / ideapad /?

Dec 19 2020

Używam i3 wm i mam w nim plik jasności /sys/class/backlight/ideapad/brightness.

╰─$ ls -la /sys/class/backlight/ideapad/

-rw-r--r-- 1 root root 4096 Dec 18 16:55 brightness

Kiedy chcę zmienić jasność (powiedzmy 4), robię:

sudo sh -c "echo 4 > /sys/class/backlight/ideapad/brightness"

Chciałbym napisać skrypt, który zwiększy lub zmniejszy jasność o 1, a następnie powiązać ten skrypt z jakąś kombinacją klawiszy w pliku konfiguracyjnym i3 wm ( CTRL+F1na przykład), abym mógł kontrolować jasność naciskając klawisze zamiast edytować plik jasności ręcznie za każdym razem, gdy chcę zmienić jasność.

Ponieważ wymaga to uprawnień roota, nie jestem pewien, jak to osiągnąć. Czy powinienem zmienić użytkownika jako właściciela brightnesspliku, czy po prostu zmienić grupę pliku? Albo w inny sposób, jaki możesz wymyślić?

Odpowiedzi

1 Quasímodo Dec 19 2020 at 19:30

/systo wirtualny system plików oparty na pamięci RAM , więc zmiana uprawnień do jego plików nie przetrwa ponownego uruchomienia.

Ten program w C jest rozwiązaniem, które napisałem jakiś czas temu i nigdy mnie nie zawiódł. Nie wymaga niczego, czego nie ma standardowy system Linux.

#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);
}

Skompiluj go ( br.cto nazwa pliku, brplik wykonywalny), zrób root'a właścicielem, włącz bit setuid i umieść plik wykonywalny gdzieś w swoim PATH( /usr/local/bin/to typowy wybór).

cc br.c -o br
chown root br
chmod u+s  br
mv br /usr/local/bin/

Teraz samo wykonanie br -100zmniejsza jasność o 100.

Zobacz, że ustawiłem również minimalną jasność na min = 10. Na moim komputerze jest to dość niskie, że prawie nie zauważa się, że wyświetlacz jest włączony. Dostosuj tę wartość do swoich potrzeb. Również dla wielu osób składnik ścieżki będzie czymś w rodzaju intel-backlightzamiast ideapad.


Alternatywne podejście

Setuid daje brpełne prawa roota. Chociaż nie powoduje to powstawania exploitów w tym konkretnym programie, jeśli chcesz być bardzo ostrożny i dać mu tylko niezbędny zestaw przywilejów - mianowicie, aby ominąć sprawdzanie uprawnień do plików - zamień chowni chmodpowyższe wiersze na odpowiednią właściwość

setcap cap_dac_override+ep br
1 ArkadiuszDrabczyk Dec 19 2020 at 00:45

Zmiana własności grupy jest zwykle właściwą drogą, ale pamiętaj, że będziesz musiał to robić za każdym razem po ponownym uruchomieniu. Aby to zrobić, automatycznie utwórz regułę udev zgodnie z opisem na Arch wiki :

Domyślnie tylko root może zmienić jasność tą metodą. Aby umożliwić użytkownikom w grupie wideo zmianę jasności, można użyć reguły udev, takiej jak poniższa:

/etc/udev/rules.d/backlight.rules

ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", GROUP="video", MODE="0664"

Jeśli nie jesteś członkiem videogrupy, dodaj do niej swojego użytkownika:

sudo gpasswd video -a $(whoami)

Zwróć uwagę, że musisz się wylogować i zalogować ponownie, aby odświeżyć informacje o członkostwie w grupie:

su -l $(whoami)

Sprawdź, czy jesteś członkiem videogrupy o identyfikatorze, powinno to wypisać coś takiego:

$ id
uid=1000(ja) gid=100(users) groups=100(users),16(dialout),17(audio),18(video),83(plugdev),215(vboxusers),281(docker)

Oczywiście w regule udev możesz użyć dowolnej grupy, do której należy Twój użytkownik, niekoniecznie video.