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


39

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

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

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

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

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


naga_plugged.pl스크립트가 종료 udev될 때까지 기다리 므로 스크립트가 완료되거나 백그라운드로 분기되도록 주의하십시오 .
rozcietrzewiacz

덕분에 naga_plugged.pl이 마지막으로 호출하는 C 코드에서 daemon (0,0)을 호출하여 데몬으로 만들었습니다. 나는 그들이 여기에 유닉스 포럼이 있다는 것을 전혀 새로운 적이 없다. 새 도메인 대신 하나의 사이트로 만들어야합니다.
over_optimistic

답변:


23

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

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

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

인증 쿠키를 찾는 것이 조금 더 어렵습니다. ~/.Xauthority기본적으로 사용자의 쿠키 파일을 찾아야합니다 (쿠키 파일 의 위치 만 있으면 쿠키 파일을 추출 할 필요가 없습니다). 많은 시스템에서 작동하지만 전부는 아닙니다. 디스플레이 관리자와 설정 방법에 따라 다르며 특히 Gdm (Ubuntu의 기본값)은 마지막으로 본 기본 위치를 사용하지 않았습니다. 실제 X 쿠키 파일을 찾는 휴대용 방법을 생각할 수 없습니다. 가장 정확한 방법은 X 프로세스의 pid를 찾고 -auth옵션 에 대한 인수를 찾는 것입니다 . 다른 방법은 해당 X 서버에서 실행중인 프로세스를 찾고 해당 XAUTHORITYenvironemnt 변수를 가져 오는 것 입니다. 쿠키 파일을 찾는 데 문제가 있으면원격 X 디스플레이에서 창을 엽니 다 ( "디스플레이를 열 수없는 이유")?

정보가 모두 있으면 선택한 디스플레이를 DISPLAY환경 변수에, 선택한 X 권한 쿠키 파일을 XAUTHORITY환경 변수 에 놓고 설정합니다. 프로그램이 어떤 사용자로 실행되는지는 중요하지 않습니다. su원하는 경우 결합하십시오 .


"-auth 옵션에 대한 인수를 어떻게 찾습니까"?
rubo77

@ rubo77와 ps이나 htop이나 ...
질 'SO-정지되는 악'

OK, 그래서 pids=$(pgrep -u $target_user nautilus)pid를 얻습니다. -auth옵션 을 어디에 두어야 합니까?
rubo77

1
@ rubo77 당신은 -auth옵션을 어디에도 두지 않습니다 . XAUTHORITY환경 변수 에 무엇을 넣을지 알아 내기 위해 X 서버 프로세스의 명령 행에서 찾아야 할 수도 있습니다 . 당신이 클라이언트의 프로세스를 가지고 있다면, 당신이 필요로하는 것은 -auth그 클라이언트 XAUTHORITY변수 의 가치에 관한 것이 아닙니다 . 당신이하려는 일을 이해하지 못합니다. 새로운 질문을하고 싶을 수도 있습니다.
Gilles 'SO- 악마 그만해


11

모든 컴퓨터에서 루트가 비활성화되어 있으므로 완전히 시도 할 수 없습니다.

사용자가 켜져있는 디스플레이를 찾으려면 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 명령을 시작합니다.


1
루트가 비활성화되어 있다고해서 물건이 루트로 실행되지 않는다는 의미는 아닙니다.) 실제로 루트로 실행되는 스크립트로이를 실행해야합니다.
xenoterracide

@xenoterracide입니다. 내가 의미하는 것은 가능한 모든 상황에서 테스트 할 수 없다는 것입니다. 즉, 나는 그것을 사용하여 루트로 테스트 sudo -i했으며 루트로 직접 로그인 한 후 결과가 실행되는 것과 다른지 확신 할 수 없었습니다. :-)
Steven D

나는 사람을 조금 수정해야했다. 이것은 who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ 작동하는 것 같습니다 ...
xenoterracide

왜 체인에 이미 괴로움이있을 때 grep과 sed를 사용 하는가는 저 밖에 있습니다.

그래 ... "learn awk"는 내 할일 목록에 잠시 동안 있었다.
Steven D

4

얼마나 멍청한 지 볼 수 있습니다. 예를 들어 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 서버를 찾아 거기서 사용자를 찾습니다. 그런 다음 ~/.XauthorityX 쿠키로 사용 합니다. 실패한 것이 없으면 실제로 X 서버에 연결할 수 없다는 것을 의미합니다 (gdm을 사용하는 우분투의 기본 설정은 X 쿠키를 사용자의 집에 저장하지 않습니다) 예배 규칙서).
질 'SO-정지 존재 악마'

예를 들어 @Gilles lid.sh는 getXconsole을 호출하지 않습니다. 따라서 fgconsole은 사용되지 않습니다. 내가 생각한 스 니펫으로 답변을 업데이트했습니다. 그리고 실제로 우분투에서 작동합니다. 뚜껑을 닫으면 화면이 꺼집니다.
maxschlepzig

1
우분투 14.04에서 오류가 발생했습니다getXuser: command not found
rubo77

1

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

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


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'

1
이 xpub 스크립트의 작성자라는 것을 명백히 밝히는 것이 좋습니다.
Dmitry Grigoryev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.