如何远程 ssh 到正在运行的 X 实例?

如何远程 ssh 到正在运行的 X 实例?

我的服务器计算机上正在运行一个 X 实例,有时我会通过 TeamViewer 远程连接到它。TeamViewer 偶尔会崩溃,我无法远程重新启动它。有没有办法通过 ssh 登录到我正在运行的 X 实例,并远程重新启动 TeamViewer?

答案1

X 程序需要两条信息才能连接到 X 显示器。

  • 它需要显示器的地址,通常是:0当您本地登录时,或:10:11您远程登录时,等等(但该数字可能会根据活动的 X 连接数而变化)。显示器的地址通常在环境变量中指示DISPLAY

  • 它需要显示器的密码。X 显示器密码称为魔法饼干:42。Magic cookies 不是直接指定的:它们总是存储在 X 授权文件中,这些文件是“display has cookie ”形式的记录集合123456。X 授权文件通常在环境变量中指示XAUTHORITY。如果$XAUTHORITY未设置,程序将使用~/.Xauthority

您正在尝试对桌面上显示的窗口进行操作。如果您是唯一使用台式机的人,则显示名称很可能是:0。查找 X 权限文件的位置比较困难,因为在 Debian squeeze 或 Ubuntu 10.04 下设置的 gdm 中,它位于一个具有随机生成名称的文件中。(您之前没有遇到任何问题,因为早期版本的 gdm 使用默认设置,即存储在 中的 cookie ~/.Xauthority。)

如果这是一次性的,您可以从正在运行的进程中检测DISPLAY和的值XAUTHORITY。这很难自动化。您必须找出连接到要处理的显示器的进程的 PID,然后从/proc/$pid/environ( eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')) 获取环境变量。

一个长期的、自动的解决方案是当您登录桌面 X 会话时复制 cookie。将以下几行添加到~/.profile(或在您登录时读取的其他脚本):

case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac

然后你只需设置一下就可以在远程 X 显示器上运行程序DISPLAY

ssh foo.example.com 'DISPLAY=:0 restart teamviewer'

此答案改编自Unix Stack Exchange 上类似问题的更完整答案

答案2

可能最简单的方法是远程(通过 SSH)在相关显示器上启动 vncserver。之后使用 SSH 隧道通过 SSH 连接将远程计算机上的 vnc 客户端连接到 VNC 服务器。

相关内容