从我的主主机[ A
](带有屏幕),我ssh
进入中继计算机[ B
](带有-X
),从那里我登录到目标计算机[ C
](再次带有-X
),并且 X 转发似乎在一段时间内运行良好。在 vim 中的目标机器 [ ] 上工作了一段时间后,我突然失去了使用 X 转发功能的能力,我需要从和C
注销,只需再次重新启动 ssh 会话,然后就可以再次正常工作。这发生在正常的一天中,即没有主机挂起(或关闭电源)。C
B
X
当一切按预期工作时,C
显示:
$ echo $DISPLAY
localhost:10.0
类似的应用程序xeyes
会被转发并在A
屏幕上呈现良好的效果。然后突然它会报告:
$ xeyes
Error: Can't open display: localhost:10.0
$ echo $DISPLAY
localhost:10.0
也/var/log/syslog
没有journalctl
(都在C
)暗示任何可疑的事情,ssh 会话再次保持活动状态并且运行良好。有人知道可能是什么问题吗?
有关主机的更多详细信息:
A
是一个物理 manjaro 盒子(连接到 LAN)B
是一台物理 Ubuntu 21.04 机器(连接到 LAN)C
是运行 Ubuntu 18.04 的虚拟机B
(通过 NAT 连接)
答案1
ForwardX11Trusted
Debian 的 man for 中的条目解释了这一点ssh_config
,Ubuntu 的行为与 Debian 相同,但与 Manjaro 不同:
ForwardX11Trusted
如果该选项设置为是的,(Debian 特定的默认值),远程 X11 客户端将具有对原始 X11 显示的完全访问权限。
如果该选项设置为否(上游默认值),远程 X11 客户端将被视为不可信,并防止窃取或篡改属于可信 X11 客户端的数据。此外, 用于会话的 xauth(1) 令牌将设置为在 20 分钟后过期。在此时间之后,远程客户端将被拒绝访问。
这可以解释为什么如果您主要使用基于 Debian 的系统(如 Ubuntu),您之前可能不会遇到此问题。
启用此选项的快捷方式是-Y
。所以你可以简单地替换-X
为-Y
第一个SSH命令来“修复”问题。
顺便说一句,转发两次 X11 显示并不是最好的方法,尤其是在使用 时-Y
,因为如果这是一种多用户堡垒系统,则 X11 显示会在中间系统 B 中暴露给其他用户。最好只转发目标机器 C 的端口 22,并通过它来隧道其他所有内容。幸运的是,有一些专门为此而设计的选项:ProxyJump
选项及其快捷方式-J
。最后你可以在机器 A 上运行:
ssh -Y -J userb@computerB userc@machineC