ssh
没有-X
机器后,是否可以更改一些设置(例如$DISPLAY
)以使其像这样工作ssh -X
?如果不是,原因是什么?谢谢。
答案1
您可以在启用 X11 转发的情况下创建第二个连接,然后您还可以DISPLAY
在第一个连接中使用第二个连接中的环境变量。
在第一个窗口中:
$ ssh user@host
user@host$ ...
在第二个窗口中:
$ ssh -Y user@host 'echo $DISPLAY; while sleep 3600; do :; done'
localhost:10.0
回到第一个窗口:
user@host$ export DISPLAY=localhost:10.0
user@host$ xterm
不幸的是,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
DISPLAY=:0
然后显示本地计算机上的身份验证信息:
$ xauth list :0
ohzd/unix:0 MIT-MAGIC-COOKIE-1 a86982ddce0c1e1c1a8c5e8b2846e43b
连接到远程机器,无需任何 X11 转发:
$ ssh user@hzy64
user@hzy64's password:
[motd snipped]
打开命令行via ~C
,添加一个从端口6000+43
到display对应的unix套接字的远程转发:0
:
hzy64$~C
ssh> -R 6043:/tmp/.X11-unix/X0
Forwarding port.
设置$DISPLAY
环境变量并将身份验证信息从本地添加到远程计算机:
hzy64$ export DISPLAY=localhost:43
hzy64$ xauth add $DISPLAY . a86982ddce0c1e1c1a8c5e8b2846e43b
xauth: file /home/user/.Xauthority does not exist
现在您已准备好出发:
hzy64$ xterm
[1] 因为误入歧途错误修正,在 Debian 中,基于用户的访问控制默认通过 开启/etc/X11/Xsession.d/35x11-common_xhost-local
。更糟糕的是,它是 XWayland 中唯一默认可用的,而且它还无法关闭。任何代理 X11 协议的程序(例如xscope
)都必须执行自己的 x11 auth cookie 检查(就像 ssh 所做的那样),除非它想打开一个通向 X11 服务器的漏洞。