我正在使用 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 权限。如果您想非常谨慎并仅授予其必要的权限集(即绕过文件权限检查),请将上面的chown
和chmod
行替换为适当的能力
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
。