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

Пользователь «balanceofpain» на Reddit предлагает:

--

FFmpeg/avconv может это сделать. Вам придется запустить его как другой пользователь, чтобы проверяемый человек не мог вмешиваться в него. Команда будет аналогична:

 avconv -f x11grab -s 1366x768 -r 25 -i :0.0 /tmp/out.mpg

Не забудьте разрешить этому пользователю доступ к X с помощьюxhost +si:localuser:

--

Следовательно, я мог бы использовать автозапуск XDG, но отдельные привилегии с помощью sudo (, чтобы предотвратить задачу уничтожения пользователем ). Остается вопрос, заканчивается ли запись в конце сеанса.

2
18.12.2020, 18:55
1 ответ

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

В приведенных ниже решениях замените ideapadсоответствующим компонентом пути в вашей системе. intel_backlightи acpi_video0являются общими.

Вариант 1 :Удев

Убедитесь, что 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"

Перезагрузка. Спасибо:Fistrosan на форуме Arch Linux .

Опция 2.1 :C + setuid

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

Вариант 2.2 :Возможности C+

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

setcap cap_dac_override+ep br
1
18.03.2021, 22:42

Теги

Похожие вопросы