使用 Windows SSH 客户端进行 X11 端口转发

使用 Windows SSH 客户端进行 X11 端口转发

我使用 PuTTY 的 X11 端口转发选项将我的 PC 连接到我的 Raspberry Pi 并运行 X11 应用程序,但我不知道如何使用 Windows 终端执行相同的操作。显然,X11 需要的不仅仅是将远程端口 6000 转发到 PC,但我不知道是什么。

我使用这个命令行来连接:

ssh -R 6000:localhost:6000 [email protected]

我也尝试添加ForwardX11 yes到本地,.ssh\config得到了类似的结果。

只要我有一个活动的 PuTTY 会话,我就可以运行 X11 应用程序。当我终止 PuTTY 会话时,我开始收到

Error: Can't open display: localhost:10.0

sudo netstat -tlp显示远程机器上的端口 6000 已打开:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
...
tcp        0      0 localhost:x11           0.0.0.0:*               LISTEN      881524/sshd: pi@pts
...

我必须做什么才能在 Windows 原生 SSH 客户端中启用 X11?

答案1

ForwardX11ForwardX11Trusted-X-Y选项)是 OpenSSH 中与 PuTTY 的“启用 X11 转发”等效的选项。

ForwardX11Trusted-Y实际上是最接近的——它提供对 X11 服务器的不受限制的访问,而ForwardX11-X限制客户端访问剪贴板或查看本地窗口。)

您可能必须手动告诉 Win32-OpenSSH 您的 X11 显示器在哪里(即它不会自动尝试猜测“localhost:0”)。为此,请DISPLAY在建立 SSH 连接之前设置环境变量,例如在 PowerShell 中:

PS>  $env:DISPLAY = "localhost:0"
PS>  ssh -Y raspi

(环境变量的语法取决于您的本地 shell。)终端您正在使用什么(无论是 Windows 终端、MinTTY 还是其他什么)根本不重要。

显然 X11 需要的不仅仅是将远程端口 6000 转发到 PC

“X11 转发”选​​项是不是“端口转发”选项——它们在客户端/服务器行为甚至协议级别上都不同。

例如,X11 要求每个客户端提供身份验证数据 - 最常见的是客户端从其~/.Xauthority文件中读取的静态密钥(“magic cookie”)。SSH 客户端必须将此身份验证数据转发给 SSH 服务器,以便允许远程客户端进行连接。

此外,端口不一定是 6000 —— 这是专门用于显示的端口,但如果本地显示器位于,则端口将是 6001,等等。“X11 转发”功能使 SSH 客户端自动查看本地 $DISPLAY 以确定 X11 服务器的位置(这也是普通 X11 应用程序的工作方式),而 SSH 服务器必须<HOST>:0<HOST>:1提供$DISPLAY 到远程应用程序。

(当然,可能甚至没有TCP 端口 – X11 经常使用除 TCP 之外的其他套接字类型;Linux 上的大多数 X11 服务器使用 UNIX 套接字,并且从不启用 TCP,而且 SSH 客户端和服务器端的情况也并不总是一样。 显示地址通过localhost:0TCP 传输,但裸:0 才不是– 在 Linux 上,它表示 UNIX 套接字。)

因此,X11 转发功能根本不使用 SSH 的“TCP 隧道”功能,它有一种专门针对 X11 的完全独立的隧道。

只要我有一个活动的 PuTTY 会话,我就可以运行 X11 应用程序。当我终止 PuTTY 会话时,我开始收到

Error: Can't open display: localhost:10.0

这听起来像是手动将 $DISPLAY 从一个会话复制到另一个会话,或者使用 tty 多路复用器(如 tmux 或 Screen)从另一个会话访问一个会话的 tty(传递 $DISPLAY)。不要这样做。

每个启用“X11 转发”的连接将分配一个新的SSH 服务器端的显示地址 – 例如,您的初始 PuTTY 会话可能会创建显示,:10而您的第二个 OpenSSH 会话可能会创建:11,即使它们都被转发到本地计算机上的同一个显示(可能既不是“:10”也不是“:11”而是:0)。

例如,当您通过 OpenSSH 连接到 SSH 服务器时,它会自动将 $DISPLAY 设置为将通过该特定基于 OpenSSH 的连接传输的 X11 显示地址。您的 X11 应用程序不关心它们在哪个 tty 中运行 - 它们只关心 $DISPLAY。

但是如果您的 $DISPLAY 设置为分配给原始 PuTTY 会话的显示地址,则所有 X11 访问当然都会通过该 PuTTY 会话进行,完全独立于您从哪个终端运行 X11 应用程序。

相关内容