Udev에서 로컬 사용자로 su하는 올바른 방법은 무엇입니까?

Udev에서 로컬 사용자로 su하는 올바른 방법은 무엇입니까?

ディスプレイ関連コマンドを実行すると、同様のコマンドはxrandrローカルユーザーとして実行した場合にのみ機能するように見えます。

ただし、udevルールを介してローカルユーザーとしてスクリプトを実行する場合:

SUBSYSTEM=="drm", ACTION=="change", RUN+="su -l --shell=/bin/bash -c /opt/echo-foo.sh chris"

として定義echo-foo.sh:

#!/bin/bash
echo "foo"

デバッグの準備udev:

udevadm control --log-priority=debug
journalctl -f # tail the logs

udevモニターを接続/切断すると、次のエラーが発生します。

Starting 'su -l --shell=/bin/bash -c /opt/echo-foo.sh chris'
Sucessfully forked off '(spawn)' as PID #####
Process 'su -l --shell=/bin/bash -c /opt/echo-foo.sh chris' failed with exit code 1.

ただし、ルートから始まるとコマンドは機能します。これを行う正しい方法はありますか?一部の詳細がありませんか?


他の細部:

-rwxr-xr-x root root 3.3K ... /opt/echo-foo.sh

- 3.3K:実際のスクリプトがコメントアウトされました。

ベストアンサー1

コマンドが「外部」でセッションに影響を与えることを可能にするには、有効な環境変数と時々変数(デプロイメントとデスクトップ環境によって異なります)を指定する必要があります。コマンドはxrandrソケットとXセッションのCookieファイルです。DISPLAYXAUTHORITY/tmp/.X11-unix/X<display number>

세션 쿠키 파일의 기본 경로 이름은 입니다 ~/.Xauthority. 파일이 기본 위치에 없으면 XAUTHORITY전체 경로 이름을 나타내기 위해 이 변수가 필요합니다.

X 서버는 실제로 들어오는 연결과 관련된 사용자 ID를 확인하지 않습니다. 이는 세션 쿠키 파일이 일반적으로 보호되므로 루트와 파일 소유자만 액세스할 수 있다는 사실에 의존합니다.

즉, 아마도 su전혀 필요하지 않을 것입니다.

SUBSYSTEM=="drm", ACTION=="change", RUN+="/bin/sh -c 'DISPLAY=:0 XAUTHORITY=/home/chris/.Xauthority xrandr ...'"

root_squash홈 디렉토리가 유효한 옵션이나 이와 유사한 옵션으로 내보낸 NFS 공유에 있지 않는 한 아마도 충분할 것입니다.

おすすめ記事