Scripting

如何編寫一個腳本來編輯/sys/class/backlight/ideapad/中的亮度文件?

  • January 12, 2022

我正在使用 i3 wm,並且我的亮度文件位於/sys/class/backlight/ideapad/brightness.

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

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

當我想改變亮度(比如 4)時,我會:

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

我想編寫一個腳本,將亮度增加或減少 1,然後將該腳本綁定到 i3 wm 配置文件中的某個組合鍵(CTRL+F1例如),以便我可以通過按鍵而不是編輯亮度文件來控制亮度每次我想改變亮度時手動。

由於這需要root權限,我不知道如何實現。我應該將我的使用者更改為brightness文件的所有者,還是應該只更改文件的組?還是你能想到的其他方式?

/sys是基於 RAM 的虛擬文件系統,因此更改其文件的權限將無法在重新啟動後繼續存在。

選項 1:Acpilight

唯一對我有用的一攬子解決方案。

在某些現代筆記型電腦上,“XRandR”可能缺乏設置顯示亮度的能力。此功能已通過/sys/class/backlight/.

“acpilight” 為xbacklight使用 ACPI 介面而不是“XRandR”的命令提供了一個直接替換,允許執行舊腳本。因此,xbacklight隨後也可以從控制台和 Wayland 使用(根本不使用 X11)。

儘管很少有發行版在其儲存庫中包含它,但您始終可以自己編譯和安裝它。然後只需使用

xbacklight +10

將亮度提高 10%。


對於選項 2 和 3,請替換ideapad為系統中的相應路徑組件。 intel_backlight並且acpi_video0是常見的。

選項 2:Udev

確保videogroups命令的輸出中。如果沒有,請將您的使用者添加到該組。

然後創建一個 Udev 規則文件sudo -e /etc/udev/rules.d/backlight.rules。內容:

RUN+="/bin/chgrp video /sys/class/backlight/ideapad/brightness"
RUN+="/bin/chmod 0664  /sys/class/backlight/ideapad/brightness"

重啟。感謝:Arch Linux 論壇的 Fistrosan

選項 3.1:C + setuid

這個 C 程序是我前段時間寫的解決方案,從來沒有讓我失望過。除了 C 編譯器之外,它不需要標準 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);
}

編譯它(br.c是文件名,br執行檔),讓 root 成為所有者,打開setuid 位並將執行檔放在你的某個位置PATH/usr/local/bin/這是一個典型的選擇)。

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

現在只需執行br -100將亮度降低 100。

看到我也將最小亮度設置為min = 10。這在我的機器上非常低,以至於幾乎沒有人注意到顯示屏已打開。根據您的需要調整該值。

選項 3.2:C + 能力

Setuid 提供br完整的 root 權限。如果你想非常謹慎並只給它必要的權限集——即繞過文件權限檢查——用適當的能力chown替換上面的和chmod

setcap cap_dac_override+ep br

引用自:https://unix.stackexchange.com/questions/625144