当我ssh -X
连接到服务器时,我将被分配一个$DISPLAY
值,通常localhost:x.0
是x
所有用户未使用的最低数字,从 10 开始。(例如,如果没有其他用户使用 $DISPLAY,则它是 10。如果某个用户已经在使用10,那么它将是 11,依此类推)
现在我的问题是:有没有办法x
在执行 时指定一个数字ssh -X
,例如100
.
我的目的是让一个独立的程序在服务器上保持运行,并始终用作localhost:100.0
其显示。这样,即使我失去了与服务器的 X 连接,我也可以重新登录并仍然建立连接,而localhost:100.0
不必担心在我断开连接期间其他用户占用同一端口。与默认的 10 相比,选择 100 大的数字可以避免大部分被占用的可能性。
答案1
有没有办法在执行 ssh -X 时为 x 指定一个数字,例如 100。
不可以,因为不仅需要“分配”号码,ssh 还需要在该号码对应的本地套接字上转发 X 协议。并且不能保证 ssh 连接时“number”是空闲的。这就是为什么 ssh 没有为此提供选项。
然后,即使我丢失了与服务器的 X 连接,我可以重新登录并仍然建立与 localhost:100.0 的连接
这是行不通的,因为该服务器是您的 X 服务器当地的机器(您通过 ssh 登录的机器),并且客户端程序正在运行偏僻的机器。因此,所有客户端程序都需要重新建立连接(因为涉及状态)。
如果您想要可以重新连接的远程桌面,请考虑使用 VNC 之类的工具。
答案2
我找到了两种方法:
第一个
- 从本地机器,
ssh -X remote
- 获取显示端口号
echo $DISPLAY | awk -F'[:.]' '{print $2}'
,假设为10 - 检查远程端口 6020 是否被使用:
lsof -i TCP:6020
,假设没有使用 - 将端口6020转发到6010:
ssh -NTR 6020:localhost:6010 localhost
可选添加(使用-f
exit时需要记住杀死此进程,推荐-f
trap "kill $!" EXIT
- 设置环境:
DISPLAY=${DISPLAY/:10/:20}
- 更新
~/.Xauthority
以让显示端口localhost:20.0
获得相同的 xauth 魔法密钥:xauth add $(xauth list :10 | sed 's/:10/:20/')
或者
- ssh 到远程而不使用
-X
:ssh remote
- 在远程机器组中
DISPLAY=localhost:20.0
- 在本地计算机中,将远程端口转发
6020
到本地计算机的 xserver 套接字/tmp/.x11-unix/X0
:ssh -NTR 6020:/tmp/.x11-unix/X0 remote
,可选地添加-f
- 将本地计算机的 xauth 密钥传输到远程计算机:在 local 中
xauth list :0
,假设它是local-hostname:0 MIT-MAGIC-COOKIE-1 hash
- 在远程机器中:执行
xauth add remote-hostname:20 MIT-MAGIC-COOKIE-1 hash
.
对比这两种方法,第一种不需要将本地机器的xauth key传输到远程机器,这或许更安全(任何专家都可以告诉我如果我这样做会引发什么潜在的安全问题吗?)。但它需要占用两个端口:一个是自己分配的端口ssh -X
,另一个是你要使用的端口。
答案3
我知道没有办法指定显示。
在 Linux 上(或者至少在 Ubuntu 上),显示器只是/tmp/.X11-unix/
.例如:/tmp/.X11-unix/X0
是显示:0
因此,您可以将任何套接字移动到任何其他路径,它仍然可以工作。 (我不确定 ssh 转发的 X 连接是否如此,但可能是。)
(顺便说一句,ssh -Y
可能比 更安全ssh -X
,但我已经很久没有使用过任何一个了。)
在任何情况下,如果套接字关闭(由于 SSH 连接结束),则在该套接字上运行的任何程序都可能退出。
如果您想运行持久的 X 程序,请考虑运行 VNC 服务器,并使用 VNC 客户端连接到它。您可以使用 SSH 安全地建立 VNC 连接隧道。我经常这样做。我相信您可以在“虚拟”显示器上运行 VNC 服务器(这意味着您只能在连接 VNC 客户端时才能看到该显示器),但我从未这样做过。
更新
因此,通过 SSH 进行 X11 转发可能涉及 3 个要素:
- 某个端口的 TCP 套接字
- DISPLAY 变量
- 处理 X 权限要求的某种形式
所有这三项都可以手动完成。您可以使用手动转发任何端口-R
。您可以手动设置显示。您可以(可能?)以某种方式手动调整 X 权限设置。处理X权限可能是最棘手的,我不知道该怎么做,但我怀疑它可以做到。
如果执行 1、2 和 3,则应该能够在不使用-X
或 的情况下转发 X11 连接-Y
。
我仍然怀疑大多数 X 程序在与服务器的连接关闭时会退出。
我仍然相信设置 VNC 服务器和客户端会给你带来更好的结果。