web-dev-qa-db-ja.com

rootとして別のユーザーのデスクトップでグラフィカルプログラムを起動できますか?

以下は、私が知っておく必要があると思う他の質問です。

  • 非Xセッションから? (ルートがXにログインしていないことを意味します)

  • Xに複数のユーザーがログインしている場合、誰がどの画面にいるのかを自動検出して、アプリを起動する必要がある画面をプログラムで検出できますか?

  • ユーザーとしてアプリを起動できますか? (わかりました99.999%これは確かにイエスです)

  • グループXのユーザーがXにログインしているかどうかを検出できますか?

39
xenoterracide

ユーザーのデスクトップでグラフィカルプログラムを起動するには、ユーザーのデスクトップが表示されている場所(アドレス)と使用する認証Cookie(パスワード)の2つを見つける必要があります。

次のコマンドは、ユーザーがログオンしているローカル画面(1行に1つ)をほとんどのunicesで一覧表示します。

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

認可クッキーを見つけるのは少し難しいです。ユーザーのCookieファイルを探す必要があります。これはデフォルトで~/.Xauthorityです(必要なのはCookieファイルの場所だけで、そこからCookieを抽出する必要はありません)。これは多くのシステムで機能しますが、すべてではありません。それは、ディスプレイマネージャーとその設定方法に依存します。特に、Gdm(Ubuntuのデフォルト)は、最後に見たデフォルトの場所を使用しませんでした。実際のX Cookieファイルを見つけるポータブルな方法は考えられません。見つける最も正確な方法は、Xプロセスのpidを見つけて、-authオプションへの引数を探すことです。別の方法は、そのXサーバーで実行されているプロセスを見つけて、そのXAUTHORITY環境変数を取得することです。 cookieファイルが見つからない場合は、 リモートXディスプレイでウィンドウを開く(「ディスプレイを開けない」理由)を参照してください。

両方の情報を入手したら、選択したディスプレイをDISPLAY環境変数に入れ、選択したX Authority cookieファイルをXAUTHORITY環境変数に入れれば、設定は完了です。プログラムを実行するユーザーは関係ありません。必要に応じて、suと組み合わせます。

すべてのマシンでrootが無効になっているため、これを完全に試すことはできません。

ユーザーが表示しているディスプレイを見つけるには、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

あなたはacpidがそれをどのように行うかを見ることができます。例えば。 xscreensaverコマンドを発行するか、XまたはXセッションを実行している各ユーザーの画面をブランクにします。

たとえばUbuntuでは、このファイルには関連するものが含まれています。

/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 Answerの拡張機能は、Cookieファイルを見つける方法です。これを行う1つの方法は、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

ご覧のとおり、ここにCookieファイルが直接表示されます。

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