제가 알아야 할 다른 질문은 다음과 같습니다.
X가 아닌 세션에서? (루트가 X에 로그인되지 않았음을 의미)
여러 사람이 X에 로그인한 경우 누가 어느 화면에 있는지 자동으로 감지하여 프로그래밍 방식으로 어떤 화면에서 앱을 실행해야 하는지 감지할 수 있습니까?
사용자로 애플리케이션을 시작할 수 있나요? (알겠습니다. 99.999% 확실하다고 확신합니다.)
그룹 X의 사용자가 X에 로그인했는지 여부를 감지할 수 있습니까?
답변1
사용자 데스크탑에서 그래픽 프로그램을 시작하려면 사용자 데스크탑이 위치한 모니터(주소)와 사용할 인증 쿠키(비밀번호)라는 두 가지 항목을 찾아야 합니다.
다음 명령은 대부분의 unice에 로그인한 사용자의 로컬 디스플레이(한 줄에 하나씩)를 나열해야 합니다.
who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'
인증 쿠키를 찾는 것은 약간 어렵습니다. 기본값 인 사용자의 쿠키 파일을 찾아야 합니다. ~/.Xauthority
필요한 것은 쿠키를 추출하는 것이 아니라 쿠키 파일의 위치뿐입니다. 이것은 많은 시스템에서 작동하지만 전부는 아닙니다. 특히 Gdm(Ubuntu의 기본값)이 마지막으로 본 기본 위치를 사용하지 않기 때문에 디스플레이 관리자와 설정 방법에 따라 다릅니다. 실제 X 쿠키 파일을 찾는 이식 가능한 방법이 생각나지 않습니다. 알아내는 가장 정확한 방법은 X 프로세스의 pid를 찾고 -auth
이 옵션에 대한 인수를 찾는 것입니다. 또 다른 접근 방식은 X 서버에서 실행 중인 프로세스를 찾아 해당 XAUTHORITY
환경 변수를 얻는 것입니다. 쿠키 파일을 찾는 데 문제가 있는 경우 다음을 참조하세요.원격 X 모니터에서 창 열기("모니터를 열 수 없습니다" 이유)?
이 두 가지 정보가 있으면 선택한 디스플레이를 DISPLAY
환경 변수에 넣고 선택한 X 권한 쿠키 파일을 XAUTHORITY
환경 변수에 넣으면 작업이 완료됩니다. 프로그램이 어떤 사용자로 실행되는지는 중요하지 않습니다. su
원하는 경우 이를 결합할 수 있습니다.
답변2
내 모든 컴퓨터에서 루트가 비활성화되어 있기 때문에 이것을 시도할 수 없습니다.
사용자가 켜져 있는 모니터를 찾으려면 이 who
명령을 사용하면 됩니다. 출력의 마지막 열은 일반적으로 사용자 로그인에 대한 DISPLAY입니다. 다음과 같은 것을 사용하여 디스플레이만 가져올 수 있습니다. (이 작업을 수행하는 더 효율적인 방법이 있을 수 있습니다. 자유롭게 편집해 주시기 바랍니다.)
who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'
그런 다음 해당 디스플레이에서 그래픽 X 명령을 실행합니다.
DISPLAY=:0 firefox &
여기서 :0은 첫 번째 명령에 표시된 내용으로 대체되고, Firefox는 실행하려는 명령으로 대체됩니다. 이를 쉘 스크립트에 넣고 변수를 사용할 수 있습니다.
다음 부분은 아직 테스트하지 않은 부분이지만 왜 이렇게 하면 안되는지 이해가 되지 않습니다.
su username -c "DISPLAY=:0 firefox"
이 사용자로 X 명령을 시작하십시오.
답변3
얼마나 빠른지 알 수 있습니다. 예를 들어 xscreensaver 명령을 실행하거나 X 또는 X 세션을 실행하는 각 사용자의 화면을 지울 때입니다.
예를 들어 Ubuntu에서는 이 파일에 관련 콘텐츠가 포함되어 있습니다.
/etc/acpi/lid.sh
다음 루프를 포함합니다:
for x in /tmp/.X11-unix/*; do
displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
getXuser;
if [ x"$XAUTHORITY" != x"" ]; then
export DISPLAY=":$displaynum"
grep -q off-line /proc/acpi/ac_adapter/*/state
if [ $? = 1 ]
then
if pidof xscreensaver > /dev/null; then
su $user -c "xscreensaver-command -unthrottle"
fi
fi
if [ x$RADEON_LIGHT = xtrue ]; then
[ -x /usr/sbin/radeontool ] && radeontool light on
fi
if [ `pidof xscreensaver` ]; then
su $user -c "xscreensaver-command -deactivate"
fi
su $user -c "xset dpms force on"
fi
done
답변4
내 연구에서 나는 제한된 환경(예: udev 규칙) 또는 수퍼유저로부터 GUI 또는 X 작업을 표시하는 우아한 방법을 찾고 있었고 최근에 이에 적합한 도구를 만들었습니다(자세한 내용은).
xpub
현재 또는 주어진 TTY에 대한 X 디스플레이 환경 변수를 얻는 데 사용되는 쉘 스크립트입니다.
다음은 udev 규칙이 포함된 예입니다.
IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"
$env{ENV}
: 현재 tty 사용자가 X를 시작하면, 그렇지 않으면 삭제합니다.
명령줄을 사용해도 원칙은 동일합니다 export
.
export $(xpub) ; su ${XUSER} -c 'notify-send Hello'