在没有 -X 的 ssh 到机器后,是否可以更改 $DISPLAY 使其像 ssh -X 一样工作?

Tim*_*Tim 23 ssh x11

ssh没有-X机器之后,是否可以更改一些设置(例如$DISPLAY)以使其工作ssh -X?如果不是,原因是什么?谢谢。

mos*_*svy 36

您可以在启用 X11 转发的情况下创建第二个连接,然后您还可以DISPLAY在第一个中使用第二个连接中的环境变量。

在第一个窗口中:

$ ssh user@host
user@host$ ...
Run Code Online (Sandbox Code Playgroud)

在第二个窗口中:

$ ssh -Y user@host 'echo $DISPLAY; while sleep 3600; do :; done'
localhost:10.0
Run Code Online (Sandbox Code Playgroud)

回到第一个窗口:

user@host$ export DISPLAY=localhost:10.0
user@host$ xterm
Run Code Online (Sandbox Code Playgroud)

不幸的是,ssh没有包含 X11(或其他)转发到它启动的进程/会话或它在远程机器上运行的用户(例如,通过使用带有/不检查凭据的 Unix 套接字,或使用命名空间),这些转发是简单的 tcp 侦听套接字,远程机器上的任何人都可以连接;X11 转发的所有安全性都依赖于 X11 身份验证。

X11 手工转发

手册sshd_config(5)页提到:

禁用 X11 转发不会阻止用户转发 X11 流量,因为用户始终可以安装自己的转发器。

这是您可以手动完成的方法。

首先,请务必禁用任何绕过 x11 身份验证机制的基于主机或用户的访问控制 [1]:

$ xhost $(xhost | sed -n /:/s/^/-/p)
access control enabled, only authorized clients can connect
Run Code Online (Sandbox Code Playgroud)

然后DISPLAY=:0在本地机器上显示认证信息:

$ xauth list :0
ohzd/unix:0  MIT-MAGIC-COOKIE-1  a86982ddce0c1e1c1a8c5e8b2846e43b
Run Code Online (Sandbox Code Playgroud)

无需任何 X11 转发即可连接到远程机器:

$ ssh user@hzy64
user@hzy64's password:
[motd snipped]
Run Code Online (Sandbox Code Playgroud)

打开命令行via ~C,添加一个从端口6000+43到display对应的unix socket的远程转发:0

hzy64$~C
ssh> -R 6043:/tmp/.X11-unix/X0
Forwarding port.
Run Code Online (Sandbox Code Playgroud)

设置$DISPLAYenvvar 并将认证信息从本地添加到远程机器:

hzy64$ export DISPLAY=localhost:43
hzy64$ xauth add $DISPLAY . a86982ddce0c1e1c1a8c5e8b2846e43b
xauth:  file /home/user/.Xauthority does not exist
Run Code Online (Sandbox Code Playgroud)

现在你准备好了:

hzy64$ xterm
Run Code Online (Sandbox Code Playgroud)

[1] 由于错误的错误修正,基于用户的访问控制在 Debian 中通过/etc/X11/Xsession.d/35x11-common_xhost-local. 更糟糕的是,它是 XWayland 中唯一一个默认可用的,也无法关闭。任何代理 X11 协议(例如xscope)的程序都必须进行自己的 x11 auth cookie 检查(就像 ssh 所做的那样),除非它想为 X11 服务器打开一个大漏洞。

  • 许多(大多数?)X11 程序不能使用`-X`,只能使用`-Y`。人们没有注意到,因为在许多系统(例如 debian)上,`ForwardX11Trusted` 默认设置为 `yes`,并且 `-X` 和 `-Y` 选项是等效的 ;-) (13认同)