代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

ssh:检查隧道是否处于活动状态

  •  30
  • Adam Matan  · 技术社区  · 15 年前

    我写了一篇 small bash script 它需要一个ssh隧道来从远程服务器提取数据,因此它会提示用户:

    echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"
    

    我想检查用户是否打开了此隧道,如果不存在隧道,则退出并显示一条错误消息。有什么方法可以查询 ssh 隧道,即检查本地端口6000是否确实隧道到该服务器?

    9 回复  |  直到 6 年前
        1
  •  27
  •   Josh Lee ZZ Coder    14 年前

    这是我的测试。希望它有用。

    # $COMMAND is the command used to create the reverse ssh tunnel
    COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_HOST:$REMOTE_HTTP_PORT:localhost:80 $USER_NAME@$REMOTE_HOST"
    
    # Is the tunnel up? Perform two tests:
    
    # 1. Check for relevant process ($COMMAND)
    pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND
    
    # 2. Test tunnel by looking at "netstat" output on $REMOTE_HOST
    ssh -p $SSH_PORT $USER_NAME@$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \
       > /dev/null 2>&1
    if [ $? -ne 0 ] ; then
       pkill -f -x "$COMMAND"
       $COMMAND
    fi
    
        2
  •  40
  •   rxw    11 年前

    Netcat是您的朋友:

    nc -z localhost 6000 || echo 'no tunnel open'; exit 1
    
        3
  •  17
  •   Pavel Oganesyan    9 年前

    autosh是最佳选择-检查过程并非在所有情况下都有效(例如僵尸进程、网络相关问题)

    例子:

    autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2
    
        4
  •  9
  •   Javeed Shakeel    7 年前

    这实际上更像是一个服务器故障类型的问题,但是您可以使用netstat。

    类似:

     # netstat -lpnt | grep 6000 | grep ssh
    

    这将告诉您是否有一个ssh进程在监听指定的端口。它还将告诉您进程的PID。

    如果您真的想再次检查ssh进程是否是以正确的选项启动的,那么您可以通过pid查找该进程,如下所示

    # ps aux | grep PID
    
        5
  •  6
  •   plaes    14 年前

    使用 autossh . 它是用来监视ssh连接的工具。

        6
  •  1
  •   Antti Rytsölä    12 年前

    电击是一个很好的工具,可以在主机之间建立半永久性连接。

    http://www.stunnel.org/

        7
  •  1
  •   Nagev    7 年前

    这些是测试或排除SSH隧道故障的更详细步骤。您可以在脚本中使用其中的一些。我添加这个答案是因为在两个应用程序停止工作后,我必须对它们之间的链接进行故障排除。仅仅对ssh进程进行grepping是不够的,因为它仍然存在。我不能用 nc -z 因为我对netcat的咒语中没有这个选项。

    让我们从头开始。假设有一台机器,它将被调用 地方的 IP地址为10.0.0.1,另一个地址为 遥远的 ,10.0.3.12。我将在下面的命令前面加上这些主机名,所以很明显它们是在哪里执行的。

    目标是创建一个隧道,将TCP通信从端口123上远程计算机上的环回地址转发到端口456上的本地计算机。这可以通过以下命令在本地计算机上完成:

    local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12
    

    要检查进程是否正在运行,我们可以执行以下操作:

    local:~# ps aux | grep ssh
    

    如果在输出中看到命令,我们可以继续。否则,检查ssh密钥是否安装在远程中。注意,在远程IP之前排除用户名,使得ssh使用当前用户名。

    接下来,我们要检查远程上的隧道是否打开:

    remote:~# netstat | grep 10.0.0.1
    

    我们应该得到类似这样的输出:

    tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED
    

    真的很高兴 看见 一些数据从远程传输到主机。这里就是 网络猫 进来。在CentOS上可以安装 yum install nc .

    首先,打开本地计算机上的侦听端口:

    local:~# nc -l 127.0.0.1:456
    

    然后在遥控器上建立连接:

    remote:~# nc 127.0.0.1 123
    

    如果打开本地机器的第二个终端,可以看到连接。像这样:

    local:~# netstat | grep 456
    tcp  0  0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
    tcp  0  0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED
    

    更好的是,继续在遥控器上输入:

    remote:~# nc 127.0.0.1 8888
    Hallo?
    anyone there?
    

    您应该看到这个镜像在本地终端上:

    local:~# nc -l 127.0.0.1:456
    Hallo?
    anyone there?
    

    隧道正在施工!但是如果你有一个申请,叫 应用程序名称 ,哪个应该在本地机器的端口456上监听?终止两边的NC,然后运行应用程序。你可以检查它在听 对的 港口与 this 以下内容:

    local:~# netstat -tulpn | grep LISTEN | grep appname
    tcp  0  0  127.0.0.1:456  0.0.0.0:* LISTEN  2964/appname
    

    顺便说一下,在远程服务器上运行相同的命令应该显示sshd正在监听端口127.0.0.1:123。

        8
  •  0
  •   sobi3ch    7 年前
    #!/bin/bash
    
    # Check do we have tunnel to example.com server
    lsof -i tcp@localhost:6000 > /dev/null
    
    # If exit code wasn't 0 then tunnel doesn't exist.
    if [ $? -eq 1 ]
    then
      echo ' > You missing ssh tunnel. Creating one..'
      ssh -L 6000:localhost:5432 example.com
    fi
    
    echo ' > DO YOUR STUFF < '
    
        9
  •  0
  •   Javeed Shakeel    7 年前

    我们可以用ps命令检查

    # ps -aux | grep ssh
    

    将显示所有运行的SHH服务,我们可以找到列出的隧道服务