列出打开的 SSH 隧道

Jam*_*ost 90 ssh shell ssh-tunnel

我在我的 linux 机器上使用了很多到各种服务器的 SSH 隧道(用于连接到数据库、Web 服务器等),通过 shell 脚本查看当前打开的隧道列表会非常方便。

我可以通过 netstat 上的 grep 识别本地连接:

netstat -n --protocol inet | grep ':22'
Run Code Online (Sandbox Code Playgroud)

但这不会向我显示它连接到的远程端口(显然包括没有隧道的标准 SSH 连接)

更新:答案很好,但没有显示我连接的远程端口。例如,我经常有一条通向 mysql 的隧道,比如 localhost:3308 映射到服务器上的 :3306。通常我可以通过我选择的本地端口来猜测,但同时访问这两个端口会很好。

有任何想法吗?

aki*_*ira 95

如果您只想列出由ssh以下人员创建的隧道:

% sudo lsof -i -n | egrep '\<ssh\>'
ssh  19749  user  3u  IPv4 148088244   TCP x.x.x.x:39689->y.y.y.y:22 (ESTABLISHED)
ssh  19749  user  4u  IPv6 148088282   TCP [::1]:9090 (LISTEN)
ssh  19749  user  5u  IPv4 148088283   TCP 127.0.0.1:9090 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

(这将是一个 -L 9090:localhost:80 隧道)

如果您想查看与以下设备建立的隧道/连接sshd

 % sudo lsof -i -n | egrep '\<sshd\>'
sshd  15767  root  3u  IPv4 147401205   TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd  15842  user  3u  IPv4 147401205   TCP x.x.x.x:22->y.y.y.y:27479 (ESTABLISHED)
sshd  15842  user  9u  IPv4 148002889   TCP 127.0.0.1:33999->127.0.0.1:www (ESTABLISHED)
sshd  1396   user  9u  IPv4 148056581   TCP 127.0.0.1:5000 (LISTEN)
sshd  25936  root  3u  IPv4 143971728   TCP *:22 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

ssh-daemon 侦听端口 22(最后一行),产生 2 个子进程(前 2 行,“用户”登录),在端口 5000 上创建的 -R 隧道和转发来自我的端口的 -L 隧道(本地)机器到 localhost:80 (www)。


小智 23

试试这个命令,它可能有用:

ps aux | grep ssh
Run Code Online (Sandbox Code Playgroud)


小智 21

不完全是您问题的解决方案,但有时也很方便:

从 ssh 会话中:

  1. 按回车
  2. 输入 ~ 然后 #

向您显示该会话的隧道上所有打开连接的列表。

  • 这仅适用于交互式隧道(没有 -N 和 -f,...),但很有趣。 (3认同)

she*_*lic 12

netstat -tpln | grep ssh
Run Code Online (Sandbox Code Playgroud)
  • t:TCP
  • p:显示进程
  • l:听
  • n:数值

编辑:@akira 评论的示例:

(header added, tested on Debian wheezy)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:1443          0.0.0.0:*               LISTEN      4036/ssh        
Run Code Online (Sandbox Code Playgroud)

可以理解为:SSH(不是 SSHd)正在侦听本地 TCP 端口 1443。


小智 5

这是这个问题的顶级谷歌结果,所以我会把我的答案放在这里。我熬了一夜过滤结果,并想出了一个很长的复杂命令,该命令仅以这种格式显示您的反向 ssh 隧道:

publicipaddress:remoteforwardedport

这是代码,我正在运行 Ubuntu Server 12。我正在运行反向 ssh 隧道,将本地端口 5900 转发到我的公共 ssh 服务器,这个漂亮的命令显示了我所有带有远程端口的公共 IP 地址。

sudo lsof -i -n | egrep '\<sshd\>' | grep -v ":ssh" | grep LISTEN | sed 1~2d | awk '{ print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done
Run Code Online (Sandbox Code Playgroud)