我使用了很多 SSH 隧道连接到我的 Linux 机器上的各种服务器(用于隧道连接到数据库、Web 服务器等),通过 shell 脚本查看当前打开的隧道列表非常方便。
我可以通过 netstat 上的 grep 识别本地连接,如下所示:
netstat -n --protocol inet | grep ':22'
但这不会显示它所连接的远程端口(显然包括未通过隧道的标准 SSH 连接)
更新:答案很好,但没有显示我所连接的远程端口。例如,我经常有一个到 mysql 的隧道,比如 localhost:3308 映射到服务器上的 :3306。通常我可以通过我选择的本地端口进行猜测,但如果可以同时访问这两个端口就更好了。
有任何想法吗?
答案1
如果你只想列出由以下人员创建的隧道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)
(这将是一个 -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)
ssh-daemon 在端口 22 上监听(最后一行),生成了 2 个子进程(前两行,'用户'登录),在端口 5000 上创建了一个 -R 隧道,并且创建了一个 -L 隧道,将端口从我的(本地)机器转发到 localhost:80(www)。
答案2
尝试这个命令,它可能会有用:
ps aux | grep ssh
答案3
这并不完全是您的问题的解决方案,但有时也很方便:
在 ssh 会话中:
- 按 Enter 键
- 输入 ~ 然后输入 #
显示该会话中隧道上所有打开的连接的列表。
答案4
这是这个问题在谷歌上得到的最佳结果,所以我将我的答案放在这里。我熬夜筛选结果,想出了一个很长很复杂的命令,它只显示你的反向 ssh 隧道,格式如下:
公共 IP 地址:远程转发端口
这是代码,我正在运行 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