Como escrever um script que edita o arquivo de brilho em / sys / class / backlight / ideapad /?
Estou usando i3 wm e tenho meu arquivo de brilho no /sys/class/backlight/ideapad/brightness
.
╰─$ ls -la /sys/class/backlight/ideapad/
-rw-r--r-- 1 root root 4096 Dec 18 16:55 brightness
Quando quero alterar o brilho (diga para 4), eu faço:
sudo sh -c "echo 4 > /sys/class/backlight/ideapad/brightness"
Gostaria de escrever um script que aumentasse ou diminuísse o brilho em 1 e depois vinculasse esse script a alguma combinação de teclas no arquivo de configuração i3 wm ( CTRL+F1
por exemplo) para que eu pudesse controlar o brilho pressionando as teclas em vez de editar o arquivo de brilho manualmente toda vez que quero alterar o brilho.
Como isso requer privilégio de root, não tenho certeza de como fazer isso. Devo alterar meu usuário como proprietário do brightness
arquivo ou devo apenas alterar o grupo do arquivo? Ou qualquer outra maneira que você possa imaginar?
Respostas
/sysé um sistema de arquivos virtual baseado em RAM , portanto, alterar a permissão de seus arquivos não sobreviverá a uma reinicialização.
Este programa C é a solução que escrevi há algum tempo e nunca me falhou. Não requer nada que um sistema Linux padrão não tenha.
#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);
}
Compile-o ( br.c
é o nome do arquivo, br
o executável), torne o root o proprietário, ative o bit setuid e coloque o executável em algum lugar do seu PATH
( /usr/local/bin/
é uma escolha típica).
cc br.c -o br
chown root br
chmod u+s br
mv br /usr/local/bin/
Agora, apenas a execução br -100
diminui seu brilho em 100.
Veja que também configurei o brilho mínimo para min = 10
. Isso é tão baixo na minha máquina que mal se nota que a tela está ligada. Ajuste esse valor de acordo com suas necessidades. Além disso, para muitas pessoas, o componente do caminho será algo como em intel-backlight
vez de ideapad
.
Abordagem alternativa
Setuid concede br
direitos completos de root. Embora isso não aumente explorações neste programa em particular, se você quiser ser muito cauteloso e dar a ele apenas o conjunto de privilégios necessário - ou seja, para contornar a verificação de permissão de arquivo -, substitua as linhas chown
e chmod
acima pelo recurso apropriado
setcap cap_dac_override+ep br
Alterar a propriedade do grupo geralmente é o caminho a percorrer, mas observe que você terá que fazer isso todas as vezes após a reinicialização. Para fazer isso, crie automaticamente uma regra udev conforme descrito no Arch wiki :
Por padrão, apenas o root pode alterar o brilho por este método. Para permitir que os usuários no grupo de vídeo alterem o brilho, uma regra do udev como a seguinte pode ser usada:
/etc/udev/rules.d/backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", GROUP="video", MODE="0664"
Se você não for membro do video
grupo, adicione seu usuário a ele:
sudo gpasswd video -a $(whoami)
Observe que você fez logout e login novamente para atualizar as informações de associação ao grupo:
su -l $(whoami)
Verifique se você é um membro do video
grupo com id, ele deve imprimir algo como:
$ id
uid=1000(ja) gid=100(users) groups=100(users),16(dialout),17(audio),18(video),83(plugdev),215(vboxusers),281(docker)
Obviamente, você pode usar qualquer grupo do qual seu usuário seja membro na regra do udev, não necessariamente video
.