以下は、私が知る必要があると思う他の質問です。
Xセッション以外からですか?(ルートがXにログインしていないことを意味します)
複数の人がXにログインしている場合、誰がどの画面にいたかを自動検出して、アプリを起動する必要がある画面をプログラムで検出できますか?
ユーザーとしてアプリを起動できますか?(OK 99.999%確かにこれはyesです)
グループXのユーザーがXにログインしているかどうかを検出できますか?
以下は、私が知る必要があると思う他の質問です。
Xセッション以外からですか?(ルートがXにログインしていないことを意味します)
複数の人がXにログインしている場合、誰がどの画面にいたかを自動検出して、アプリを起動する必要がある画面をプログラムで検出できますか?
ユーザーとしてアプリを起動できますか?(OK 99.999%確かにこれはyesです)
グループXのユーザーがXにログインしているかどうかを検出できますか?
回答:
ユーザーのデスクトップでグラフィカルプログラムを起動するには、ユーザーのデスクトップが表示されているもの(アドレス)と使用する認証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
必要に応じて組み合わせてください。
ps
or htop
or…
pids=$(pgrep -u $target_user nautilus)
pidを取得し、-auth
オプションをどこに置く必要がありますか?
-auth
オプションをどこにも配置しないでください。XAUTHORITY
環境変数に何を入れるかを把握するために、Xサーバープロセスのコマンドラインでそれを探す必要があるかもしれません。クライアントのプロセスがある場合、必要なのは-auth
そのクライアントのXAUTHORITY
変数の値以外の何物でもありません。あなたが何をしようとしているのか理解できません。新しい質問をすることもできます。
すべてのマシンのルートが無効になっているため、これを完全に試すことはできません。
ユーザーがどのディスプレイを使用しているかを調べるには、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コマンドを起動します。
sudo -i
したのはrootとしてのみテストしており、root として直接ログインした後に実行した場合と結果が異なるかどうかはわかりませんでした。:-)
who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
はうまくいくようです...
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はユーザーの家に保存されません)ディレクトリ)。
getXuser: command not found
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ファイルはここに直接表示されます。
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'
naga_plugged.pl
スクリプトが終了udev
するのを待っているので、スクリプトが終了する(またはバックグラウンドに分岐する)ことに注意してください。