
ディスプレイ関連コマンドを実行すると、同様のコマンドは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ファイルです。DISPLAY
XAUTHORITY
/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 공유에 있지 않는 한 아마도 충분할 것입니다.
答え2
/bin/sh -c '...'
-- 예상대로 작동하려면 필요합니다.