如何了解活动的SSH端口转发

我在~/.ssh/config中配置了许多端口转发,用于不同服务器的VNC。
有没有一条命令可以帮助我在打开SSH会话时知道哪个端口正在进行转发?
1个回答

如果你使用-v选项来执行ssh命令,它会显示你正在转发的内容(但同时也会显示一堆其他的调试信息):
ssh -v -L2222:localhost:22 remotehost

会向您展示:

...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...

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

~#

这将以以下方式列出连接:
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)

请注意,这只会列出实际被另一个程序使用的转发端口(在这种情况下,我只是在本地机器上执行了telnet localhost 2222以将其转发到remotehost)。
如果您没有任何当前正在进行转发的连接,您仍然可以通过使用以下方式查看您的ssh命令在本地监听的内容:netstat命令。
% 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       
netstat命令可能还会列出其他内容,但你要在输出中查找的是PID/Program列,以查找ssh进程,并且要查看Local Address列,它将显示正在监听哪些端口。在这个例子中,我的机器上IPv4和IPv6接口都在监听端口2222

1感谢您的回答,我的目标是在/etc/update-motd.d/中添加脚本来显示重定向的端口。但是使用~#命令,我只能看到服务器上重定向的端口。而目标是显示(ssh -v输出的一部分): 本地连接到LOCALHOST:5901转发到远程地址127.0.0.1:5900 本地转发监听::1端口5901。似乎无法仅在客户端显示这两行。 - slc66
3对于2020年及以后来到这里的人们,netstat已经被ss取代了。 - ScumCoder
1@ScumCoder 只适用于Linux操作系统。 - Tripp Kinetics