如何编写编辑/sys/class/backlight/ideapad/中亮度文件的脚本?

如何编写编辑/sys/class/backlight/ideapad/中亮度文件的脚本?

我正在使用 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,还是应该更改文件的组?或者你能想到其他的办法吗?

答案1

/sys是一个基于RAM的虚拟文件系统,因此更改其文件的权限将无法在重新启动后继续存在。

选项1:阿皮莱特

唯一对我有用的软件包解决方案。

在某些现代笔记本电脑上,“XRandR”可能无法设置显示亮度。此功能已通过 移动/统一到内核的 ACPI 接口/sys/class/backlight/

“acpilight”提供了使用 ACPI 接口而不是“XRandR”的命令的直接替换xbacklight,允许旧脚本运行。因此,xbacklight随后也可以从控制台和 Wayland 使用(根本不使用 X11)。

尽管很少有发行版在其存储库中包含它,但您始终可以自己编译和安装它。然后只需使用

xbacklight +10

使亮度增加 10%。


对于选项 2 和 3,请替换ideapad为系统中适当的路径组件。 intel_backlight并且acpi_video0都是常见的。

选项 2:Udev

确保video位于命令的输出中groups。如果没有,请将您的用户添加到该组中。

然后创建一个 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成为所有者,打开设置用户ID位并将可执行文件放在您的某个位置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 权限。如果您想非常谨慎并仅授予其必要的权限集(即绕过文件权限检查),请将上面的chownchmod行替换为适当的能力

setcap cap_dac_override+ep br

答案2

更改组所有权通常是可行的方法,但请注意,每次重新启动后都必须执行此操作。为此,请自动创建 udev 规则,如下所述拱门维基:

默认情况下,只有 root 可以通过此方法更改亮度。要允许视频组中的用户更改亮度,可以使用如下 udev 规则:

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

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

如果您不是群组成员,video请将您的用户添加到其中:

sudo gpasswd video -a $(whoami)

请注意,您已注销并重新登录以刷新组成员身份信息:

su -l $(whoami)

检查您是否是具有 id 的组的成员video,它应该打印如下内容:

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

当然,您可以使用您的用户在 udev 规则中所属的任何组,但不一定video

相关内容