我正在使用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)中的某些键组合中,以便我可以通过按下键来控制亮度,而不是每次更改亮度时手动编辑亮度文件。
由于这需要根特权,我不知道如何实现这一点。是将用户更改为brightness文件的所有者,还是只更改文件的组?或者其他你能想到的方法?
发布于 2020-12-19 12:30:41
/sys是一个基于RAM的虚拟文件系统。,因此更改其文件的权限将无法在重新启动后存活下来。
唯一对我有用的解决方案。
在一些现代笔记本电脑上,"XRandR“可能缺乏设置显示亮度的能力。该功能通过
/sys/class/backlight/被移动/统一到内核的ACPI接口中。"acpilight“提供了xbacklight命令的插入替代器,该命令使用ACPI接口而不是"XRandR",从而允许运行旧脚本。因此,也可以从控制台和Wayland使用xbacklight(根本不使用X11)。
虽然很少有发行版在它们的存储库中有它,但是您始终可以自己编译和安装它。那就用
xbacklight +10使亮度增加10%。
对于选项2和3,请将ideapad替换为系统中的适当路径组件。intel_backlight和acpi_video0是常见的。
确保video在groups命令的输出中。如果没有,请将用户添加到该组中。
然后使用sudo -e /etc/udev/rules.d/backlight.rules创建一个Udev规则文件。内容:
RUN+="/bin/chgrp video /sys/class/backlight/ideapad/brightness"
RUN+="/bin/chmod 0664 /sys/class/backlight/ideapad/brightness"重新启动。感谢:Fistrosan在Arch Linux论坛上。
这个C程序是我一段时间前写的解决方案,从未辜负过我。它不需要标准的Linux系统除了一个C编译器之外没有任何东西。
#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是可执行文件),使根成为所有者,打开塞图德钻头并将可执行文件放在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。这在我的机器上很低,几乎没人注意到显示器在开着。根据你的需要调整这个值。
Setuid赋予br完整的根权限。如果您想非常谨慎,并且只给它必要的特权集,即绕过文件权限检查-,用适当的能力替换上面的chown和chmod行。
setcap cap_dac_override+ep brhttps://unix.stackexchange.com/questions/625144
复制相似问题