我可以以root用户身份在另一个用户的桌面上启动图形程序吗?


39

以下是我想知道的其他问题:

  • 来自非X会话?(表示root未登录X)

  • 如果在X上登录了多个用户,我是否可以自动检测到哪个用户在哪个屏幕上,从而以编程方式检测我需要在哪个屏幕上启动该应用程序?

  • 我可以以用户身份启动该应用程序吗?(确定,我99.999%的人肯定是的)

  • 是否可以检测X组的用户是否登录到X?


请注意naga_plugged.pl脚本完成(或派生到后台),因为udev它将等待其退出。
rozcietrzewiacz 2011年

谢谢,我通过在naga_plugged.pl最后调用的C代码中调用daemon(0,0)使其成为了守护程序。我从不陌生,他们在这里开设了Unix论坛。他们应该使它成为一个站点,而不是新域。
2011年

Answers:


23

要在用户的桌面上启动图形程序,您需要找到两件事:用户桌面的显示内容(地址)和要使用的授权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服务器上运行的进程并获取其XAUTHORITYenvironemnt变量。如果您找不到Cookie文件,请参阅打开远程X显示器上的窗口(为什么“无法打开显示器”)?

掌握了这两条信息后,将选定的显示内容放入DISPLAY环境变量中,将选定的X授权cookie文件放入XAUTHORITY环境变量中,即可进行设置。程序以何种用户身份运行都无关紧要;su如果愿意,可以结合使用。


您如何“寻找-auth选项的参数”?
rubo77 2014年

@ rubo77使用pshtop或…
别再作恶了'

确定,因此pids=$(pgrep -u $target_user nautilus)获取pid,我必须在哪里放置-auth期权?
rubo77

1
@ rubo77您不会在-auth任何地方放置期权。您可能需要在X服务器进程的命令行中查找它,以找出要在XAUTHORITY环境变量中添加的内容。如果您有一个客户程序,那么您所需要的不-auth只是客户XAUTHORITY变量的值。我不明白您要做什么。您可能要问一个新问题。
吉尔(Gilles)'所以别再邪恶了'

我尝试在此处使用您的信息来解决如何在由root发起的屏幕上创建通知
rubo77

11

我无法完全尝试此操作,因为我的所有计算机都已禁用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命令。


1
仅仅因为禁用了root并不意味着某些东西不会以root的身份运行;)我实际上需要以以root身份运行的脚本来运行它。
xenoterracide

@xenoterracide,对。我的意思是,我无法在所有可能的情况下进行测试。也就是说,我只使用root用户身份对其进行了测试,sudo -i无法确定结果是否与直接以root用户身份登录后的运行结果有所不同。:-)
Steven D

我不得不修改谁。这who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$ 似乎有效...
xenoterracide

为什么在链中已经存在awk时为什么有人使用grep和sed超出了我。

是的...“ learn awk”已经出现在我的待办事项列表上一段时间了。
史蒂文D

4

您可以看看它是多么轻松。例如,当它发出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存储在用户的家中目录)。
吉尔斯(Gillles)“所以-别再作恶了” 2010年

例如,@ Gilles lid.sh不会调用getXconsole。因此,不使用fgconsole。我用我想到的代码片段更新了答案。它实际上可以在Ubuntu上运行。关闭盖子时屏幕变黑。
maxschlepzig

1
在Ubuntu 14.04中,我得到了一个错误getXuser: command not found
rubo77

1

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文件将直接显示在此处。


0

在我的研究中,找到了从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'

1
我建议您清楚地知道您是此xpub脚本的作者。
德米特里·格里戈里耶夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.