/ sys / class / backlight / ideapad /の明るさファイルを編集するスクリプトを書く方法は?

Dec 19 2020

私はi3wmを使用していて、明るさファイルをに持っています/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はRAMベースの仮想ファイルシステムであるため、ファイルのアクセス許可を変更しても再起動後は存続しません。

この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完全なroot権限を与えます。これはこの特定のプログラムでエクスプロイトを引き起こすことはありませんが、非常に慎重になり、必要な特権セットのみを与える場合、つまりファイルのアクセス許可チェックをバイパスする場合は、上記の行chownchmod行を適切な機能に置き換えてください。

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

通常はグループの所有権を変更する方法ですが、再起動後は毎回変更する必要があることに注意してください。これを行うには、Arch wikiで説明されているようにudevルールを自動的に作成します:

デフォルトでは、ルートのみがこの方法で明るさを変更できます。ビデオグループのユーザーが明るさを変更できるようにするには、次のような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)

videoIDを持つグループのメンバーであるかどうかを確認すると、次のように出力されます。

$ id
uid=1000(ja) gid=100(users) groups=100(users),16(dialout),17(audio),18(video),83(plugdev),215(vboxusers),281(docker)

もちろん、ユーザーがudevルールのメンバーである任意のグループを使用できますが、必ずしも使用する必要はありませんvideo