首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写在/sys/class/backlight/ideapad/中编辑亮度文件的脚本?

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

Unix & Linux用户
提问于 2020-12-18 16:55:00
回答 1查看 1.2K关注 0票数 4

我正在使用i3 wm,并且在/sys/class/backlight/ideapad/brightness中有我的亮度文件。

代码语言:javascript
复制
╰─$ ls -la /sys/class/backlight/ideapad/

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

当我想改变亮度(比方说到4)时,我会:

代码语言:javascript
复制
sudo sh -c "echo 4 > /sys/class/backlight/ideapad/brightness"

我想编写一个脚本,该脚本将亮度增加或降低1,然后将该脚本绑定到i3 wm配置文件(例如CTRL+F1)中的某些键组合中,以便我可以通过按下键来控制亮度,而不是每次更改亮度时手动编辑亮度文件。

由于这需要根特权,我不知道如何实现这一点。是将用户更改为brightness文件的所有者,还是只更改文件的组?或者其他你能想到的方法?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-12-19 12:30:41

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

选项1:认可

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

在一些现代笔记本电脑上,"XRandR“可能缺乏设置显示亮度的能力。该功能通过/sys/class/backlight/被移动/统一到内核的ACPI接口中。"acpilight“提供了xbacklight命令的插入替代器,该命令使用ACPI接口而不是"XRandR",从而允许运行旧脚本。因此,也可以从控制台和Wayland使用xbacklight (根本不使用X11)。

虽然很少有发行版在它们的存储库中有它,但是您始终可以自己编译和安装它。那就用

代码语言:javascript
复制
xbacklight +10

使亮度增加10%。

对于选项2和3,请将ideapad替换为系统中的适当路径组件。intel_backlightacpi_video0是常见的。

选项2: Udev

确保videogroups命令的输出中。如果没有,请将用户添加到该组中。

然后使用sudo -e /etc/udev/rules.d/backlight.rules创建一个Udev规则文件。内容:

代码语言:javascript
复制
RUN+="/bin/chgrp video /sys/class/backlight/ideapad/brightness"
RUN+="/bin/chmod 0664  /sys/class/backlight/ideapad/brightness"

重新启动。感谢:Fistrosan在Arch Linux论坛上

选项3.1: C+ setuid

这个C程序是我一段时间前写的解决方案,从未辜负过我。它不需要标准的Linux系统除了一个C编译器之外没有任何东西。

代码语言:javascript
复制
#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/是典型的选择)。

代码语言:javascript
复制
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完整的根权限。如果您想非常谨慎,并且只给它必要的特权集,即绕过文件权限检查-,用适当的能力替换上面的chownchmod行。

代码语言:javascript
复制
setcap cap_dac_override+ep br
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/625144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档