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

xen*_*ide 40 root xorg session

以下是我认为我需要了解的其他问题:

  • 来自非 X 会话?(意味着 root 没有登录到 X)

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

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

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

Gil*_*il' 24

要在用户的桌面上启动图形程序,您需要找到两件事:用户桌面的显示内容(地址)和要使用的授权 cookie(密码)。

以下命令应列出用户在大多数 unice 上登录的本地显示(每行一个):

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'
Run Code Online (Sandbox Code Playgroud)

找到授权 cookie 有点困难。您必须查找用户的 cookie 文件,这是~/.Xauthority默认的(您只需要 cookie 文件的位置,您不需要从中提取 cookie)。这适用于许多系统,但不是全部;这取决于显示管理器及其设置方式,特别是 Gdm(Ubuntu 上的默认设置)没有使用我上次查看的默认位置。我想不出一种可移植的方法来找出实际的 X cookie 文件。找出最准确的方法是找出 X 进程的 pid 并查找-auth选项的参数。另一种方法是找到在该 X 服务器上运行的进程并获取其环境XAUTHORITY变量。如果您在查找 cookie 文件时遇到问题,请参阅在远程 X 显示器上打开一个窗口(为什么“无法打开显示器”)?

一旦你有了这两条信息,把选择的显示放在DISPLAY环境变量中,把选择的 X 权限 cookie 文件放在XAUTHORITY环境变量中,你就设置好了。程序以什么用户身份运行并不重要;su如果您愿意,可以结合使用。


Ste*_*n D 11

我不能完全尝试这个,因为我所有的机器都禁用了 root。

要查找用户在哪个显示器上,您可以使用该who命令。输出的最后一列通常是用户登录的 DISPLAY。像这样的东西可以用来抓取显示(可能有一种更有效的方法来做到这一点,随时提供编辑):

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'
Run Code Online (Sandbox Code Playgroud)

然后在该显示器上启动图形 X 命令:

DISPLAY=:0 firefox &
Run Code Online (Sandbox Code Playgroud)

其中 :0 将替换为您在第一个命令中找到的任何显示,而 firefox 将替换为您要运行的任何命令。你可以把它放在一个 shell 脚本中,然后只使用一个变量。

下一部分是我没有测试过的部分,但我不明白为什么不应该这样做:

su username -c "DISPLAY=:0 firefox"
Run Code Online (Sandbox Code Playgroud)

以该用户身份启动 X 命令。