在机器B上,我远程访问机器C
$ ssh -X t@C
$ echo $DISPLAY
localhost:10.0
如何找到/验证$DISPLAY
C 上到$DISPLAY
B 上的映射?可以通过C上的以下命令完成吗?
$ netstat -a | grep 6010
tcp 0 0 localhost:6010 0.0.0.0:* LISTEN
tcp6 0 0 ip6-localhost:6010 [::]:* LISTEN
既然已经创建了 X 转发通道,为什么$DISPLAY
C 和 B LISTEN之间的连接没有建立?$DISPLAY
当我在 C 上运行 X 客户端时,如何验证它是否连接到 B(本地机器)上的 X 服务器?为什么我在下面得到的关于端口 6010 的信息比运行 X 客户端之前更多?
$ eog &
[1] 1129
$ netstat -a | grep 6010
tcp 0 0 localhost:6010 0.0.0.0:* LISTEN
tcp 0 0 localhost:59782 localhost:6010 TIME_WAIT
tcp 0 0 localhost:59780 localhost:6010 ESTABLISHED
tcp 0 0 localhost:59778 localhost:6010 TIME_WAIT
tcp 0 0 localhost:6010 localhost:59780 ESTABLISHED
tcp6 0 0 ip6-localhost:6010 [::]:* LISTEN
谢谢。
“C 上的 $DISPLAY 到 B 上的 $DISPLAY 的映射”是什么意思?
显然你
grep
在 C 上没有什么东西,所以你只能在 C 上看到涉及“端口号 = 6010”的套接字。C 上的其他连接或侦听套接字已断开grep
。您之前没有看到任何连接,因为没有任何 X 客户端正在运行并连接到 sshd(端口号=6010),之后还有更多信息,因为您现在运行了一个已连接到您的 sshd(端口号)的 X 客户端=6010)。
使用 SSH 隧道时,您必须了解网络拓扑。C 上的 SSH 服务器打开一个新的套接字,该套接字侦听端口 6010,因为 B 上的 SSH 客户端要求它。在 B 上的 SSH 客户端和 C 上的 SSH 服务器之间仍然建立 ssh 隧道(端口号 = 22,如果 sshd 不是特殊配置),你看不到这个隧道连接,因为你
grep
出去了。C 上的 X 客户端连接到 sshd(端口号=6010),然后 sshd 使用 ssh 隧道复用这些连接,并将这些连接转发到 B 上的 X 服务器。“C 上的 $DISPLAY 和 B 上的 $DISPLAY 之间的连接”实际上并不存在,ssh 隧道是在 C:22 和 address_of_the_SSH_client_on_B 之间创建的。而且由于它是一个连接,因此在 LISTENING 状态下是不可能的。
使用
netstat -ap
无需grep
查看更多信息。我们在这个答案中提到的所有连接都意味着真正的 TCP 连接,从内核的角度来看,而不是从最终用户的角度来看的“连接”。
X 转发通道尚未创建。它仅在客户端连接到
6010
您的C
(远程)机器上的端口时创建。该连接将通过ssh 连接作为单独的通道转发(而不是通过C
和之间的不同 tcp 连接B
)。要显示通过 ssh 连接转发的所有通道,您应该~#
在行首使用转义:我不知道有任何直接的方法来检查它。我不知道返回运行 X11 服务器的机器的任何 X11 核心协议或扩展请求。您应该逐步进行:首先检查 X11 客户端是否连接到转发器,然后检查它在哪里转发连接等。