ログアウトするためのgnome-session-quitは、sudoを使用してrootとして実行すると機能しません。

ログアウトするためのgnome-session-quitは、sudoを使用してrootとして実行すると機能しません。

私は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

そこで、root であるため、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ルートとしてログアウトするにはどうすればいいですか?ルートとして実行されるスクリプトを入れたいので(強制的にプロセスを終了させたくはなく、通常のログアウトプロンプトを表示させたい)


さらなる仕様:-

ルートとして実行されるスクリプトがあります。

#! /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

ユーザーが既存の環境変数を保持することをセキュリティ ポリシーに示します。ユーザーに環境を保持する権限がない場合、セキュリティ ポリシーはエラーを返すことがあります。


いくつかのコマンドを root として実行し、その後ログアウトできるようにするスクリプトが必要な場合は、次のようにします。

  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.sh、環境変数がスクリプトで使用できることを保証し、 は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
}

関連情報