我从家里的电脑运行 ssh -X 来登录工作中的两台 RedHat 服务器,将它们称为 G 和 B(代表好和坏)。使用 G,一切正常,我可以在那里启动一个 GUI 程序并让它显示在我的家用电脑上(顺便说一下,它运行的是 Windows Subsystem for Linux)。但是使用 B,使用 ssh -X 登录时会显示错误消息“X11 转发请求在通道 0 上失败”,我无法从 B 启动 GUI。
我已阅读了 StackExchange 上有关类似问题的所有内容(例如 仅在单个服务器上 X11 转发失败),并尝试了(几乎?)一切方法,但都失败了。
据我所知,G 和 B 在所有重要的事情上都是相同的:我的 ~/.ssh/ 文件的内容是相同的,/etc/ssh/ssh_config、/etc/ssh/sshd_config 等也是相同的,它们的权限也是如此;xauth list
除了服务器名称外,两者的输出都相同。我猜他们运行的 RH 版本略有不同,但非常接近。而且它们位于同一个防火墙后面。
我使用以下方式在两者上创建了 ~/.Xauthority 文件
xauth add localhost:10.0 . <hexkey>
我对两者使用了相同的十六进制密钥,因为复制一个密钥比从头创建一个密钥更容易。这些十六进制密钥没有什么特殊含义,对吧?它们只是随机的 32 个十六进制数字序列?(我也尝试使用 创建 .Xauthority 文件xauth generate...
,但除非定义了 $DISPLAY,否则这似乎是不可能的,而当我仅使用 ssh 时则不是。我想如果ssh -X...
有效的话应该可以,但这就是 Catch-22。)我尝试了xauth extract... xauth merge
xauth 手册页中提到的技巧,但那也没有用;我仍然收到相同的错误消息。
当我将 -v (详细)参数与 ssh -X 一起使用时,两者都会打印出来(以及其他内容)
debug1: Requesting X11 forwarding with authentication spoofing.
正如他们应该的那样。
我尝试在 ~/.ssh/rc 中编写一些调试代码,这些代码基于 sshd 手册页中的代码(基于 Stack Exchange 上另一个问答中的建议)。代码如下所示:
echo d="$DISPLAY" > /dev/stderr
read proto cookie
echo p=$proto > /dev/stderr
echo c=$cookie > /dev/stderr
这当然会阻止 XForwarding 正常工作,但重点是查看发生了什么。以下是在 G 上打印的内容:
d=localhost:10.0
p=MIT-MAGIC-COOKIE-1
c= <32 hex digits here>
以下是在 B 上打印的内容:
d=
p=
c=
因此看起来 B 看不到任何 $DISPLAY、proto 或 cookie,而 G 却可以正常看到它们。
一直以来,我都假设错误出在 B 上的代码或配置上;但现在我想知道错误是否出在我的客户端(我的家用电脑)上,它将所需的信息发送给了 G,但没有发送给 B。但我在我的家用电脑上没有看到 G 和 B 之间有什么不同。
我还应该尝试什么?