如何知道活动的 ssh 端口转发

slc*_*c66 16 ssh port-forwarding

~/.ssh/config为 VNC配置了许多端口转发,每个服务器都有不同的端口。

是否有命令可以帮助我知道打开 SSH 会话时转发到哪个端口?

acu*_*ich 17

如果您使用该-v选项,ssh它将向您显示您要转发的内容(但它也会向您显示一堆其他调试消息):

ssh -v -L2222:localhost:22 remotehost
Run Code Online (Sandbox Code Playgroud)

会告诉你:

...debug messages...
debug1: Authentication succeeded (publickey).
Authenticated to remotehost ([10.0.0.23]:22).
debug1: Local connections to LOCALHOST:2222 forwarded to remote address localhost:22
debug1: Local forwarding listening on ::1 port 2222.
debug1: channel 0: new [port listener]
debug1: Local forwarding listening on 127.0.0.1 port 2222.
...debug messages...
Run Code Online (Sandbox Code Playgroud)

然后当您连接到该远程 shell 时,您可以键入一个特殊的键序列:

~#
Run Code Online (Sandbox Code Playgroud)

这将列出这样的连接:

The following connections are open:
  #3 client-session (t4 r0 i0/0 o0/0 fd 7/8 cc -1)
  #4 direct-tcpip: listening port 2222 for localhost port 22, connect from 127.0.0.1 port 59742 (t4 r1 i0/0 o0/0 fd 10/10 cc -1)
Run Code Online (Sandbox Code Playgroud)

但是请注意,这只会列出其他程序实际使用的转发端口(在这种情况下,我只是telnet localhost 2222在本地计算机上将其转发到remotehost.

如果您没有任何当前正在转发的连接,您仍然可以使用如下netstat命令查看 ssh 命令在本地侦听的内容:

% netstat -tpln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:2222          0.0.0.0:*               LISTEN      28995/ssh       
tcp6       0      0 ::1:2222                :::*                    LISTEN      28995/ssh       
Run Code Online (Sandbox Code Playgroud)

netstat命令还可能会列出其他内容,但您要在输出中查找的是PID/Program查找ssh进程的Local Address列,以及显示正在侦听哪些端口的列。在这个例子中,它正在监听port 2222我机器上的 IPv4 和 IPv6 接口。

  • 对于 2020 年以后来到这里的人们:`netstat` 已经过时,取而代之的是 `ss`。 (3认同)