디스플레이 관련 명령을 실행할 때 유사한 명령은 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 세션 쿠키 파일.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 '...'
-- 예상대로 작동하려면 필요합니다.