다음은 알아야 할 다른 질문입니다.
비 X 세션에서? (루트가 X에 로그인되지 않았다는 의미)
X에 여러 사람이 로그인 한 경우 누가 어떤 화면에서 누가 있었는지 자동 감지하여 앱을 실행해야하는 화면을 프로그래밍 방식으로 감지 할 수 있습니까?
사용자로 앱을 시작할 수 있습니까? (알겠습니다. 99.999 %입니다.
그룹 X의 사용자가 X에 로그인했는지 감지 할 수 있습니까?
다음은 알아야 할 다른 질문입니다.
비 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
원하는 경우 결합하십시오 .
ps
이나 htop
이나 ...
pids=$(pgrep -u $target_user nautilus)
pid를 얻습니다. -auth
옵션 을 어디에 두어야 합니까?
-auth
옵션을 어디에도 두지 않습니다 . XAUTHORITY
환경 변수 에 무엇을 넣을지 알아 내기 위해 X 서버 프로세스의 명령 행에서 찾아야 할 수도 있습니다 . 당신이 클라이언트의 프로세스를 가지고 있다면, 당신이 필요로하는 것은 -auth
그 클라이언트 XAUTHORITY
변수 의 가치에 관한 것이 아닙니다 . 당신이하려는 일을 이해하지 못합니다. 새로운 질문을하고 싶을 수도 있습니다.
모든 컴퓨터에서 루트가 비활성화되어 있으므로 완전히 시도 할 수 없습니다.
사용자가 켜져있는 디스플레이를 찾으려면 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 명령을 시작합니다.
sudo -i
했으며 루트로 직접 로그인 한 후 결과가 실행되는 것과 다른지 확신 할 수 없었습니다. :-)
who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
작동하는 것 같습니다 ...
얼마나 멍청한 지 볼 수 있습니다. 예를 들어 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
/usr/share/acpi-support/power-funcs
. fgconsole
활성 Linux vt를 찾도록 호출 한 다음이 콘솔에 표시되는 X 서버를 찾아 거기서 사용자를 찾습니다. 그런 다음 ~/.Xauthority
X 쿠키로 사용 합니다. 실패한 것이 없으면 실제로 X 서버에 연결할 수 없다는 것을 의미합니다 (gdm을 사용하는 우분투의 기본 설정은 X 쿠키를 사용자의 집에 저장하지 않습니다) 예배 규칙서).
getXuser: command not found
Gilles 답변의 확장은 쿠키 파일을 찾는 방법입니다. 이를 수행하는 한 가지 방법은 DISPLAY
환경 변수 를 설정 한 후 (Giles에서 설명한대로) 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'
naga_plugged.pl
스크립트가 종료udev
될 때까지 기다리 므로 스크립트가 완료되거나 백그라운드로 분기되도록 주의하십시오 .