Bagaimana cara menulis skrip yang mengedit file kecerahan di / sys / class / backlight / ideapad /?
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+F1
misalnya) 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 brightness
file atau haruskah saya mengubah grup file? Atau cara lain yang dapat Anda pikirkan?
Jawaban
/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.c
adalah nama file, br
yang 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 -100
mengurangi 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-backlight
bukan ideapad
.
Pendekatan alternatif
Setuid memberikan br
hak 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 chown
dan di chmod
atas dengan kemampuan yang sesuai
setcap cap_dac_override+ep br
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 video
grup, 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 video
grup 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
.