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


39

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

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

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

  • ユーザーとしてアプリを起動できますか?(OK 99.999%確かにこれはyesです)

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


naga_plugged.plスクリプトが終了udevするのを待っているので、スクリプトが終了する(またはバックグラウンドに分岐する)ことに注意してください。
rozcietrzewiacz

おかげで、naga_plugged.plが最後に呼び出すcコードでdaemon(0,0)を呼び出してデーモンにしました。ここにunixフォーラムがあったことは決して新しいことではありません。新しいドメインではなく、すべて1つのサイトにする必要があります。
over_optimistic

回答:


23

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

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

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

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

両方の情報を取得したら、選択したディスプレイをDISPLAY環境変数に入れ、選択したXオーソリティCookieファイルをXAUTHORITY環境変数に入れて、設定します。プログラムを実行するユーザーは関係ありません。su必要に応じて組み合わせてください。


「-authオプションの引数を探す」方法は?
rubo77 14年

@ rubo77 with psor htopor…
ジル「SO-悪であるのをやめる」14年

OK、だからpids=$(pgrep -u $target_user nautilus)pidを取得し、-authオプションをどこに置く必要がありますか?
rubo77 14年

1
@ rubo77 -authオプションをどこにも配置しないでください。XAUTHORITY環境変数に何を入れるかを把握するために、Xサーバープロセスのコマンドラインでそれを探す必要があるかもしれません。クライアントのプロセスがある場合、必要なのは-authそのクライアントのXAUTHORITY変数の値以外の何物でもありません。あなたが何をしようとしているのか理解できません。新しい質問をすることもできます。
ジル 'SO-悪であるのをやめる' 14年

ここであなたの情報を使用して、ルートによって開始された画面に通知
rubo77 14年

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したのはrootとしてのみテストしており、root として直接ログインした後に実行した場合と結果が異なるかどうかはわかりませんでした。:-)
スティーブンD

私は誰を少し修正しなければなりませんでした。これwho | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ はうまくいくようです...
xenoterracide

すでにチェーンにawkが存在するのに、だれもがgrepとsedを使用する理由は、私を超えています。

ええ...「learn awk」は今や私のToDoリストに載っています。
スティーブンD

4

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

具体的には、コードはにあり/usr/share/acpi-support/power-funcsます。fgconsoleアクティブなLinux vtを見つけるために呼び出してから、このコンソールに表示されているXサーバーを探し、そこからユーザーを見つけます。次に~/.Xauthority、X Cookieとして使用します。不足しているものがない限り、実際にはXサーバーに接続できません(gdmを使用したUbuntuのデフォルト設定では、X Cookieはユーザーの家に保存されません)ディレクトリ)。
ジル 'SO-悪であるのをやめる

たとえば、@ Gilles lid.shはgetXconsoleを呼び出しません。したがって、fgconsoleは使用されません。私が考えていたスニペットで答えを更新しました。そして、それは実際にUbuntu上で動作します。蓋を閉じると画面が消えます。
maxschlepzig

1
Ubuntuの14.04で、私はエラーを取得getXuser: command not found
rubo77

1

Gillesの答えの拡張は、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ファイルはここに直接表示されます。


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スクリプトの作成者であることを明確にすることをお勧めします。
ドミトリーグリゴリエフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.