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 세션 쿠키 파일.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 공유에 있지 않는 한 아마도 충분할 것입니다.

답변2

/bin/sh -c '...' 

-- 예상대로 작동하려면 필요합니다.

관련 정보