it-swarm-ko.tech

다른 사용자의 데스크탑에서 루트로 그래픽 프로그램을 시작할 수 있습니까?

다음은 알아야 할 다른 질문입니다.

  • 비 X 세션에서? (루트가 X에 로그인되지 않았다는 의미)

  • X에 여러 사람이 로그인 한 경우 누가 어떤 화면에서 누가 있었는지 자동 감지하여 앱을 실행해야하는 화면을 프로그래밍 방식으로 감지 할 수 있습니까?

  • 사용자로 앱을 시작할 수 있습니까? (알겠습니다. 99.999 %입니다.

  • 그룹 X의 사용자가 X에 로그인했는지 감지 할 수 있습니까?

39
xenoterracide

사용자 데스크탑에서 그래픽 프로그램을 시작하려면 사용자 데스크탑이 표시되는 것 (주소)과 사용할 권한 쿠키 (암호)의 두 가지를 찾아야합니다.

다음 명령은 대부분의 유니스에서 사용자가 로그온 한 로컬 디스플레이 (한 줄에 하나씩)를 나열해야합니다.

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 명령을 시작합니다.

11
Steven D

얼마나 멍청한 지 볼 수 있습니다. 예 : 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
4
maxschlepzig

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

보다시피 쿠키 파일이 여기에 바로 나타납니다.

1
Bichoy

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'
0
Thomas Venries