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

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

私が知っておくべき他の質問は次のとおりです。

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

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

  • ユーザーとしてアプリケーションを起動できますか? (わかりました。99.999%確実だと確信しています。)

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

答え1

ユーザーデスクトップでグラフィックプログラムを起動するには、ユーザーデスクトップが配置されているモニター(アドレス)と使用する認証クッキー(パスワード)の2つの項目を見つける必要があります。

次のコマンドは、ほとんどの unice にログインしたユーザーのローカル表示 (1 行に 1 つずつ) を一覧表示する必要があります。

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

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

この 2 つの情報がある場合は、選択したディスプレイをDISPLAY環境変数に入れ、選択した X 権限 Cookie ファイルをXAUTHORITY環境変数に入れると、操作が完了します。プログラムがどのユーザーとして実行されるかは問題ではありません。su必要に応じてそれらを組み合わせることができます。

答え2

私のすべてのコンピュータで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 コマンドを開始します。

答え3

どれくらい速いかわかります。たとえば、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

私の研究では、私は限られた環境(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}:現在のttyユーザーがXを起動した場合、それ以外の場合は削除します。

コマンドラインを使用しても原則は同じですexport

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'

関連情報