Как написать скрипт, редактирующий файл яркости в / sys / class / backlight / ideapad /?

Dec 19 2020

Я использую 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 Quasímodo Dec 19 2020 at 19:30

/sys- это виртуальная файловая система на основе ОЗУ , поэтому изменение разрешений для ее файлов не сохранится после перезагрузки.

Эта программа на 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. На моей машине этого достаточно мало, чтобы не заметить, что дисплей включен. Настройте это значение в соответствии с вашими потребностями. Также для многих компонент пути будет чем-то вроде intel-backlightвместо ideapad.


Альтернативный подход

Setuid дает brполные рут права. Хотя это не вызывают подвиги в этой конкретной программе, если вы хотите быть очень осторожными и дать ему только необходимый набор Priviledge , а именно - шунтирование файл проверке разрешения -, подставят chownи chmodстроки сверху соответствующей возможность

setcap cap_dac_override+ep br
1 ArkadiuszDrabczyk Dec 19 2020 at 00:45

Смена владельца группы - это обычно способ, но обратите внимание, что вам придется делать это каждый раз после перезагрузки. Для этого автоматически создайте правило udev, как описано в Arch wiki :

По умолчанию только 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)

Проверьте, являетесь ли вы членом 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.