我的服务器计算机上正在运行一个 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'
答案2
可能最简单的方法是远程(通过 SSH)在相关显示器上启动 vncserver。之后使用 SSH 隧道通过 SSH 连接将远程计算机上的 vnc 客户端连接到 VNC 服务器。