sudo를 사용하여 루트로 실행하면 로그아웃하는 gnome-session-quit가 작동하지 않습니다.

sudo를 사용하여 루트로 실행하면 로그아웃하는 gnome-session-quit가 작동하지 않습니다.

저는 Ubuntu 14.04를 실행 중이고 사용자 이름은 pandya입니다.

pandya@pandya-desktop:~$ gnome-session-quit

위의 명령이 실행되면없이터미널에서 sudo( sudo su)하면 성공적으로 로그아웃됩니다. 여기에 이미지 설명을 입력하세요


그러나 sudo 이후에 (루트로) 실행할 때,

root@pandya-desktop:/home/pandya# gnome-session-quit

오류가 발생합니다.

** (gnome-session-quit:3168): WARNING **: Failed to call logout: The name org.gnome.SessionManager was not provided by any .service files

그래서 루트이기 때문에 sudo -u pandya gnome-session-quit사용자 pandya로 명령을 실행하기 위해 명령을 실행하려고 합니다. 하지만 같은 오류가 발생합니다.

그런 다음 다음과 같이 pandya로 실행하려고 합니다.

root@pandya-desktop:/home/pandya# su pandya
pandya@pandya-desktop:~$ gnome-session-quit

** (gnome-session-quit:3269): WARNING **: Failed to call logout: The name org.gnome.SessionManager was not provided by any .service files

하지만 같은 오류가 발생합니다.

따라서 내 질문은 다음과 같습니다.루트로 로그아웃하는 방법은 무엇입니까? gnome-session-quit루트로 실행될 sctipt를 넣고 싶기 때문입니다.. (강제적으로 프로세스를 종료하고 싶지 않고 정상적인 로그아웃 프롬프트를 원함)


추가 사양:-

루트로 실행될 스크립트가 있습니다.

#! /bin/bash
....command to be executed.....
sudo -u pandya gnome-session-quit

답변1

무엇을 하려는지 완전히 확신할 수 없지만 sudo명령이 실패하는 이유는 X 서버를 시작했지만 pandya실행 중인 Gnome 세션과 통신할 수 있는 pandya의 환경 변수를 내보내지 않았기 때문입니다.

따라서 Gnome 세션을 종료할 수 있습니다.

sudo -E -u pandya gnome-session-quit

에서 man sudo:

-E, --preserve-env

사용자가 기존 환경 변수를 보존하려는 보안 정책을 나타냅니다. 사용자에게 환경 보존 권한이 없는 경우 보안 정책에서 오류가 반환될 수 있습니다.


일부 명령을 루트로 실행한 후 로그아웃할 수 있도록 하는 스크립트를 원하는 경우 다음과 같이 할 수 있습니다.

  1. sudo권한 있는 명령 없이 스크립트를 생성 하지만~와 함께 sudo로그아웃을 위해 예를 들어:

    #!/bin/bash
    
    apt-get install firefox
    sudo -E -u pandya gnome-session-quit
    
  2. 다음을 사용하여 스크립트를 실행하십시오 sudo -E.

    sudo -E /path/to/script
    

그러면 sudo -E script.shenv 변수가 스크립트에 사용 가능하고 해당 sudo -E -u pandya변수가 호출에 전달되는지 확인됩니다 gnome-session-quit.

답변2

다른 사용자/세션을 로그아웃하려는 경우를 대비하여 gnome-session 환경에서 DBUS 세션 변수를 설정하는 이 스크립트를 만들었습니다.

명령줄에서 Gnome-Shell을 다시 시작하는 방법은 무엇입니까?

function logout() {
    local USERNAME
    export USERNAMES=( ) 
    while [ -n "$1" ]; do case "$1" in
        -* ) break ;;
        *) USERNAMES+=( "$1" ); shift ;;
    esac; done

    for USERNAME in "${USERNAMES[@]}"; do
        local SESSION_PID=$(pgrep -fu "$USERNAME" gnome-session|head -1)
        if [ -n "$SESSION_PID" ]; then
            (
                sudo -u "$USERNAME" cat "/proc/$SESSION_PID/environ" | xargs -0 -n 1 echo export
                echo "gnome-session-quit --logout $@"
            ) | sudo -u "$USERNAME" sh -;
        fi
    done
}

관련 정보