
私が知っておくべき他の質問は次のとおりです。
非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'