Answers:
要在用户的桌面上启动图形程序,您需要找到两件事:用户桌面的显示内容(地址)和要使用的授权cookie(密码)。
以下命令应列出用户在大多数unice上登录的本地显示(每行一个):
who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'
查找授权cookie有点困难。您必须查找用户的cookie文件,~/.Xauthority
默认情况下是这样(您只需要cookie文件的位置即可,无需从中提取cookie)。可以在许多系统上运行,但不是全部。它取决于显示管理器及其设置方式,尤其是Gdm(Ubuntu上的默认设置)没有使用我上次查看的默认位置。我想不出一种可移植的方法来找出实际的X cookie文件。最准确的找出方法是找出X进程的pid并寻找该-auth
选项的参数。另一种方法是找到在该X服务器上运行的进程并获取其XAUTHORITY
environemnt变量。如果您找不到Cookie文件,请参阅打开远程X显示器上的窗口(为什么“无法打开显示器”)?
掌握了这两条信息后,将选定的显示内容放入DISPLAY
环境变量中,将选定的X授权cookie文件放入XAUTHORITY
环境变量中,即可进行设置。程序以何种用户身份运行都无关紧要;su
如果愿意,可以结合使用。
ps
或htop
或…
pids=$(pgrep -u $target_user nautilus)
获取pid,我必须在哪里放置-auth
期权?
-auth
任何地方放置期权。您可能需要在X服务器进程的命令行中查找它,以找出要在XAUTHORITY
环境变量中添加的内容。如果您有一个客户程序,那么您所需要的不-auth
只是客户XAUTHORITY
变量的值。我不明白您要做什么。您可能要问一个新问题。
我无法完全尝试此操作,因为我的所有计算机都已禁用root用户权限。
要查找用户在哪个显示器上,可以使用who
命令。输出的最后一列通常是用户登录的DISPLAY。可以使用类似这样的方式来获取显示内容(执行此操作的效率可能更高,请随时进行编辑):
who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'
然后在该显示屏上启动图形X命令:
DISPLAY=:0 firefox &
其中::0将替换为您在第一个命令中找到的任何显示,而Firefox将替换为您要运行的任何命令。您可以将其放在shell脚本中,而只需使用一个变量。
下一部分是我尚未测试的部分,但我不明白为什么不应该这样做:
su username -c "DISPLAY=:0 firefox"
以该用户身份启动X命令。
sudo -i
无法确定结果是否与直接以root用户身份登录后的运行结果有所不同。:-)
who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
似乎有效...
您可以看看它是多么轻松。例如,当它发出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服务器(Ubuntu使用gdm的默认设置不会将X Cookie存储在用户的家中目录)。
getXuser: command not found
Gilles答案的扩展是如何查找cookie文件。一种方法是在设置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
是一个Shell脚本,用于获取有关当前TTY或给定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'
naga_plugged.pl
脚本完成(或派生到后台),因为udev
它将等待其退出。