在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 身份验证。
手册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)
设置$DISPLAY
envvar 并将认证信息从本地添加到远程机器:
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 服务器打开一个大漏洞。