列出打开的SSH隧道


67

我在Linux机器上使用了很多SSH隧道(用于隧道到数据库,Web服务器等),并且通过Shell脚本查看当前打开的隧道列表非常方便。

我可以通过以下方式在netstat上通过grep识别本地连接:

netstat -n --protocol inet | grep ':22'

但这不会向我显示其连接到的远程端口(并且显然包括未建立隧道的标准SSH连接)

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

有任何想法吗?


4
我最近看到了几个类似的问题(不是您要问的是什么),但是与ssh有关提供有关连接的信息有关。像ssh一样酷,它提供了一些基本的有用信息。您可以运行一些客户端内部命令,例如<ret> <ret>〜#和$ SSH_CONNECTION环境变量,但是它们实际上在细节上很少。一条正在运行的隧道列表会很好。也许是时候提出功能要求了。
2011年

Answers:


72

如果您只想列出由创建的隧道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个子进程(前2行,“用户”登录),在端口5000上创建的-R隧道,以及从我的(本地)计算机到localhost:80(www)。


仅在第三行,因为正在使用TCP套接字。它只是说通过ssh隧道传输的内容已经命中了本地Web服务器,而不是说33999端口已转发到80端口。
shellholic 2011年

多数民众赞成在-L隧道的本质...
akira

很好,它显示了远程IP地址和隧道端口列表。我理想情况下想知道的是其隧道连接到的远程端口。例如,如果我在本地打开了从3308到服务器上3306的隧道,则我希望同时看到两者。
James Frost

为此,您将必须登录服务器并在其中执行与sshd相关的lsof(可靠),或者为所有ssh命令解析/ proc / PID / cmdline的输出..这可能会给您造成误导的结果也可以通过.ssh / config指定隧道。
akira

是的,很有道理。需要对该脚本稍加精巧,然后解析结果,获取远程服务器列表并在每个服务器上执行相同的命令以检索远程端口。绝对可行。会加油的!
James Frost


16

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

在ssh会话中:

  1. 按Enter
  2. 输入〜,然后输入#

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


2
这仅适用于交互式隧道(不带-N和-f,...),但很有趣。
erik

6
netstat -tpln | grep ssh
  • 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        

可以将其读取为:SSH(不是SSHd)正在侦听本地TCP端口1443。


还要注意,它-p仅显示您自己的进程(所有进程均以root身份显示)。另外,该命令sshd也会显示。
Olli

-R隧道,您必须避免-l
akira

-R如果未使用隧道,则无法在本地看到隧道。但是没错,如果在使用中,您可以在没有-l
shellholic的

5

这是此问题的Google最佳搜索结果,所以我将答案放在这里。我整夜熬夜过滤结果,并想出了一个很长的复杂命令,该命令仅向您显示此格式的反向ssh隧道:

publicipaddress:远程转发端口

这是代码,我正在运行Ubuntu Server12。我正在运行反向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

2
report_local_port_forwardings() {

  # -a ands the selection criteria (default is or)
  # -i4 limits to ipv4 internet files
  # -P inhibits the conversion of port numbers to port names
  # -c /regex/ limits to commands matching the regex
  # -u$USER limits to processes owned by $USER
  # http://man7.org/linux/man-pages/man8/lsof.8.html
  # https://stackoverflow.com/q/34032299

  echo 
  echo "LOCAL PORT FORWARDING"
  echo
  echo "You set up the following local port forwardings:"
  echo

  lsof -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN

  echo
  echo "The processes that set up these forwardings are:"
  echo

  ps -f -p $(lsof -t -a -i4 -P -c '/^ssh$/' -u$USER -s TCP:LISTEN)

}

report_remote_port_forwardings() {

  echo 
  echo "REMOTE PORT FORWARDING"
  echo
  echo "You set up the following remote port forwardings:"
  echo

  ps -f -p $(lsof -t -a -i -c '/^ssh$/' -u$USER -s TCP:ESTABLISHED) | awk '
  NR == 1 || /R (\S+:)?[[:digit:]]+:\S+:[[:digit:]]+.*/
  '
}

report_local_port_forwardings
report_remote_port_forwardings

样本输出:

LOCAL PORT FORWARDING

You set up the following local port forwardings:

COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ssh     10086 user     7u  IPv4 1924960      0t0  TCP localhost:2301 (LISTEN)
ssh     10086 user     9u  IPv4 1924964      0t0  TCP localhost:2380 (LISTEN)
ssh     10086 user    11u  IPv4 1924968      0t0  TCP localhost:2381 (LISTEN)

The processes that set up these forwardings are:

UID        PID  PPID  C STIME TTY          TIME CMD
user     10086  7074  0 13:05 pts/21   00:00:00 ssh -N ssh.example.com

REMOTE PORT FORWARDING

You set up the following remote port forwardings:

UID        PID  PPID  C STIME TTY      STAT   TIME CMD
user      7570 30953  0 11:14 pts/18   S      0:00 ssh -N -R 9000:localhost:3000 ssh.example.com


0
#!/ bin / csh -f
回显SSH隧道已连接
回声
foreach f(`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | cut -d“” -f45- | cut -d“ /” -f1` )
设置ip =`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep建立| grep $ f | 切-d“” -f20- | cut -d“:” -f1`
#set h =`grep -a“ $ ip” /htdocs/impsip.html | grep br | 切-d“” -f2`
echo -n“ $ ip”
echo`netstat -an -p | grep tcp | grep sshd | grep -v :: | grep -v 0:22 | grep LISTEN | grep $ f | cut -d“:” -f2 | 切-d“” -f1`
#echo“ $ h”
结束

0

由于我不喜欢lsof,因此建议您使用其他方法(另一个人教我:)):

$ netstat -l | grep ssh

这样,您将显示ssh在LISTEN模式下打开的ssh隧道(默认情况下被省略netstat)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.