Jak napisać skrypt edytujący plik jasności w / sys / class / backlight / ideapad /?
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+F1
na 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 brightness
pliku, czy po prostu zmienić grupę pliku? Albo w inny sposób, jaki możesz wymyślić?
Odpowiedzi
/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.c
to nazwa pliku, br
plik 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 -100
zmniejsza 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-backlight
zamiast ideapad
.
Alternatywne podejście
Setuid daje br
peł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ń chown
i chmod
powyższe wiersze na odpowiednią właściwość
setcap cap_dac_override+ep br
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 video
grupy, 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 video
grupy 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
.