如果我不是控制台上登录的用户,如何运行一个X应用程序并在该X会话上显示?假设我是root用户或者是之前登录的同一个用户,理论上我有权限这样做。但是我如何让X相信这一点呢?
下面是一些类似这种情况的例子:
- 通过SSH登录并运行一个显示在远程计算机屏幕上的程序(不是通过SSH隧道传输的-那是完全不同的)
- 使用ImageMagick的
import
命令进行定时任务截取X会话的屏幕截图 - 为审计目的运行一个按键记录器
如果我不是控制台上登录的用户,如何运行一个X应用程序并在该X会话上显示?假设我是root用户或者是之前登录的同一个用户,理论上我有权限这样做。但是我如何让X相信这一点呢?
下面是一些类似这种情况的例子:
import
命令进行定时任务截取X会话的屏幕截图DISPLAY
环境变量,然后应用程序就可以运行。ssh -X
为您处理此操作,这就是它很棒的原因,但手动过程涉及在 X 服务器帐户上运行 xauth extract - $DISPLAY
并将该数据提供给客户端帐户上的 xauth merge -
。(警告:数据是二进制的。)$HOME/.Xauthority
,因此您通常可以在 Bash 中设置两个环境变量:export XAUTHORITY=/home/$your_username/.Xauthority
export DISPLAY=':0'
结论是您需要知道X显示(位于DISPLAY
环境变量中)和魔法Cookie(位于一个文件中,文件名在XAUTHORITY
环境变量中)。
在运行X的系统上,如果您是root用户或与登录到X的相同用户,则假设使用最常见的显示和cookie文件(适用于任何发行版的标准桌面安装)。
env DISPLAY=:0 XAUTHORITY=/home/whoever/.Xauthority /path/to/my/X/program
从已经运行的X程序的环境中找到它们。如果您是root用户或使用同一用户登录,这将告诉您(如果用户正在使用GNOME):
cat /proc/`pgrep -f ^x-session-manager`/environ \
| ruby -ne 'puts $_.split("\0").select { |e| e =~ /^(DISPLAY|XAUTHORITY)=/ }'
export XAUTHLOCALHOSTNAME=localhost
。 - palswimsudo -u“$user”-n qdbus…
是更好的选择。2. 如果没有,则必须以某种方式获取目标会话中的所有环境变量(set
),并在sudo
内部导出它们,然后再运行命令。 - anon