다음은 알아야 할 다른 질문입니다.
비 X 세션에서? (루트가 X에 로그인되지 않았다는 의미)
X에 여러 사람이 로그인 한 경우 누가 어떤 화면에서 누가 있었는지 자동 감지하여 앱을 실행해야하는 화면을 프로그래밍 방식으로 감지 할 수 있습니까?
사용자로 앱을 시작할 수 있습니까? (알겠습니다. 99.999 %입니다.
그룹 X의 사용자가 X에 로그인했는지 감지 할 수 있습니까?
사용자 데스크탑에서 그래픽 프로그램을 시작하려면 사용자 데스크탑이 표시되는 것 (주소)과 사용할 권한 쿠키 (암호)의 두 가지를 찾아야합니다.
다음 명령은 대부분의 유니스에서 사용자가 로그온 한 로컬 디스플레이 (한 줄에 하나씩)를 나열해야합니다.
who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'
인증 쿠키를 찾는 것이 조금 더 어렵습니다. 기본적으로 ~/.Xauthority
인 사용자의 쿠키 파일을 찾아야합니다 (쿠키 파일의 위치 만 있으면 쿠키를 추출 할 필요가 없습니다). 많은 시스템에서 작동하지만 전부는 아닙니다. 디스플레이 관리자와 설정 방법에 따라 다르며 특히 Gdm (Ubuntu의 기본값)은 마지막으로 본 기본 위치를 사용하지 않았습니다. 실제 X 쿠키 파일을 찾는 휴대용 방법을 생각할 수 없습니다. 가장 정확한 방법은 X 프로세스의 pid를 찾고 -auth
옵션에 대한 인수를 찾는 것입니다. 다른 방법은 해당 X 서버에서 실행중인 프로세스를 찾고 XAUTHORITY
environemnt 변수를 가져 오는 것입니다. 쿠키 파일을 찾는 데 문제가 있으면 원격 X 디스플레이에서 창 열기 ( "디스플레이를 열 수없는 이유")? 를 참조하십시오.
정보가 모두 있으면 선택한 디스플레이를 DISPLAY
환경 변수에, 선택한 X 권한 쿠키 파일을 XAUTHORITY
환경 변수에 넣고 설정합니다. 프로그램이 어떤 사용자로 실행되는지는 중요하지 않습니다. 원하는 경우 su
와 결합하십시오.
모든 컴퓨터에서 루트가 비활성화되어 있으므로 완전히 시도 할 수 없습니다.
사용자가있는 디스플레이를 찾으려면 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 명령을 시작합니다.
얼마나 멍청한 지 볼 수 있습니다. 예 : xscreensaver 명령을 실행하거나 X 또는 X-session을 실행하는 각 사용자의 화면을 비 웁니다.
예를 들어 우분투 에서이 파일에는 관련 내용이 포함되어 있습니다.
/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
Gilles 답변의 확장은 쿠키 파일을 찾는 방법입니다. 이를 수행하는 한 가지 방법은 DISPLAY
환경 변수를 설정 한 후 (Gilles에서 설명한대로) strace
를 사용하여 xhost
액세스 파일을 찾으십시오. BASH에서 이와 같은 것을 생각할 수 있습니다.
# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access
위 코드의 결과는 다음과 같습니다.
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0
보다시피 쿠키 파일이 여기에 바로 나타납니다.
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}
: current-tty-user가 X를 시작하면 제거하십시오.
export
를 사용하는 명령 행에 대한 원칙은 동일합니다.
export $(xpub) ; su ${XUSER} -c 'notify-send Hello'