Как написать скрипт, редактирующий файл яркости в / 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
файла или просто изменить группу файла? Или любым другим способом, который вы можете придумать?
Ответы
/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
Смена владельца группы - это обычно способ, но обратите внимание, что вам придется делать это каждый раз после перезагрузки. Для этого автоматически создайте правило 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
.