Bagaimana cara menulis skrip yang mengedit file kecerahan di / sys / class / backlight / ideapad /?

Dec 19 2020

Saya menggunakan i3 wm dan file kecerahan saya masuk /sys/class/backlight/ideapad/brightness.

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

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

Ketika saya ingin mengubah kecerahan (katakanlah ke 4) saya lakukan:

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

Saya ingin menulis skrip yang akan menambah atau mengurangi kecerahan sebesar 1 dan kemudian mengikat skrip itu ke beberapa kombinasi tombol di file konfigurasi wm i3 ( CTRL+F1misalnya) sehingga saya dapat mengontrol kecerahan dengan menekan tombol alih-alih mengedit file kecerahan secara manual setiap kali saya ingin mengubah kecerahan.

Karena ini membutuhkan hak akses root, saya tidak yakin bagaimana cara mencapainya. Haruskah saya mengubah pengguna saya sebagai pemilik brightnessfile atau haruskah saya mengubah grup file? Atau cara lain yang dapat Anda pikirkan?

Jawaban

1 Quasímodo Dec 19 2020 at 19:30

/sysadalah sistem file virtual berbasis RAM , jadi mengubah izin file tidak akan bertahan saat reboot.

Program C ini adalah solusi yang telah saya tulis beberapa waktu lalu dan tidak pernah mengecewakan saya. Itu tidak memerlukan apa pun yang tidak dimiliki sistem Linux standar.

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

Kompilasikan ( br.cadalah nama file, bryang dapat dieksekusi), jadikan root sebagai pemilik, nyalakan bit setuid dan letakkan yang dapat dieksekusi di suatu tempat di Anda PATH( /usr/local/bin/adalah pilihan umum).

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

Sekarang hanya mengeksekusi br -100mengurangi kecerahan Anda sebesar 100.

Lihat bahwa saya juga telah mengatur kecerahan minimum ke min = 10. Itu cukup rendah pada mesin saya sehingga orang hampir tidak memperhatikan bahwa layarnya menyala. Sesuaikan nilai itu sesuai kebutuhan Anda. Juga bagi banyak orang jalan komponen akan menjadi sesuatu seperti intel-backlightbukan ideapad.


Pendekatan alternatif

Setuid memberikan brhak root penuh. Meskipun ini tidak meningkatkan eksploitasi dalam program khusus ini, jika Anda ingin sangat berhati-hati dan memberikannya hanya set hak istimewa yang diperlukan - yaitu, untuk melewati pemeriksaan izin file -, gantikan baris chowndan di chmodatas dengan kemampuan yang sesuai

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

Mengubah kepemilikan grup biasanya merupakan cara yang harus dilakukan tetapi perhatikan bahwa Anda harus melakukannya setiap kali setelah reboot. Untuk melakukan ini secara otomatis membuat aturan udev seperti yang dijelaskan di Arch wiki :

Secara default, hanya root yang dapat mengubah kecerahan dengan metode ini. Untuk mengizinkan pengguna di grup video mengubah kecerahan, aturan udev seperti berikut ini dapat digunakan:

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

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

Jika Anda bukan anggota videogrup, tambahkan pengguna Anda ke dalamnya:

sudo gpasswd video -a $(whoami)

Perhatikan bahwa Anda telah keluar dan masuk kembali untuk menyegarkan informasi keanggotaan grup:

su -l $(whoami)

Periksa apakah Anda anggota videogrup dengan id, itu harus mencetak sesuatu seperti:

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

Tentu saja, Anda dapat menggunakan grup mana pun yang pengguna Anda adalah anggotanya di aturan udev, belum tentu video.