如何在 `ssh -X` 之后找到 `$DISPLAY` 上的映射?

如何在 `ssh -X` 之后找到 `$DISPLAY` 上的映射?

在B机上,我远程访问C机

$ ssh -X t@C
$ echo $DISPLAY
localhost:10.0

如何找到/验证$DISPLAYC 上到$DISPLAYB 上的映射?在C上可以通过下面的命令来完成吗?

$ netstat -a | grep 6010
tcp        0      0 localhost:6010          0.0.0.0:*               LISTEN     
tcp6       0      0 ip6-localhost:6010      [::]:*                  LISTEN 

X 转发通道已经创建,为什么$DISPLAYC 和 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

谢谢。

答案1

“C 上的 $DISPLAY 到 B 上的 $DISPLAY 的映射”是什么意思?

显然,您grep在 C 上缺少某些内容,因此您只能在 C 上看到涉及“端口号 = 6010”的套接字。 C 上的其他连接或侦听套接字已grep断开。

您之前没有看到任何连接,因为没有任何 X 客户端运行并连接到 sshd(端口号=6010),之后有更多信息,因为您现在运行一个 X 客户端,它已连接到您的 sshd(端口号=6010)。

使用SSH隧道时,您必须了解网络拓扑。 C 上的 SSH 服务器打开一个新的套接字,该套接字侦听端口 6010,因为 B 上的 SSH 客户端要求这样做。B 上的 SSH 客户端和 C 上的 SSH 服务器之间仍然建立了 ssh 隧道(端口 num=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 -apwithoutgrep查看更多信息。

我们在这个答案中提到的所有连接都意味着从内核的角度来看真正的TCP连接,而不是从最终用户的角度来看“连接”。

答案2

既然 X 转发通道已创建,为什么 C 上的 $DISPLAY 和 B LISTEN 上的 $DISPLAY 之间的连接未建立?

X转发通道尚未创建。仅当客户端连接到(远程)计算机6010上的端口时才会创建它。C连接将作为单独的通道转发通过ssh 连接(不通过C和之间的不同 TCP 连接B)。要显示通过 ssh 连接转发的所有通道,您应该~#在行的开头使用转义符:

$ ssh -X localhost
$ ~#
The following connections are open:
  #0 client-session (t4 r0 i0/0 o0/0 fd 5/6 cc -1)
$ netstat | grep 6010

$ xterm &
$ ~#
The following connections are open:
  #0 client-session (t4 r0 i0/0 o0/0 fd 5/6 cc -1)
  #1 x11 (t4 r3 i0/0 o0/0 fd 8/8 cc -1)
$ netstat | grep 6010
tcp6       0      0 localhost:6010          localhost:39698         ESTABLISHED
tcp6       0      0 localhost:39698         localhost:6010          ESTABLISHED

当我在 C 上运行 X 客户端时,如何验证它是否连接到 B(本地计算机)上的 X 服务器?

我不知道有什么直接的方法来检查这一点。我不知道任何返回 X11 服务器运行的机器的 X11 核心协议或扩展请求。您应该一步一步地执行此操作:首先检查 X11 客户端是否连接到转发器,然后检查它将连接转发到何处等。

相关内容