ssh:检查隧道是否存活

时间:2010-01-04 08:49:57

标签: ssh tunneling ssh-tunnel

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

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

我想检查用户是否已打开此隧道,如果没有隧道,则退出并显示错误消息。有没有办法查询ssh隧道,即检查本地端口6000是否真的通过隧道连接到该服务器?

10 个答案:

答案 0 :(得分:41)

Netcat是你的朋友:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1

答案 1 :(得分:27)

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

# $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 :(得分:17)

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

示例:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2

答案 3 :(得分:9)

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

类似的东西:

 # netstat -lpnt | grep 6000 | grep ssh

这将告诉您是否有ssh进程侦听指定的端口。它还会告诉你进程的PID。

如果您真的想要仔细检查ssh进程是否使用正确的选项启动,那么您可以通过PID查找过程,例如

# ps aux | grep PID

答案 4 :(得分:6)

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

答案 5 :(得分:1)

stunnel是在主机之间建立半永久连接的好工具。

http://www.stunnel.org/

答案 6 :(得分:1)

这些是测试或排除SSH隧道故障的更详细步骤。您可以在脚本中使用其中一些。我添加了这个答案,因为我必须在两个应用程序停止工作后对其进行故障排除。只是为了ssh过程而进行的操作还不够,因为它仍然存在。而且我无法使用nc -z,因为我的netcat咒语无法使用该选项。

让我们从头开始。假设有一台机器,在10.0.3.12处称为本地,IP地址为10.0.0.1,另一台称为远程。我将这些主机名添加到下面的命令中,因此它们在执行的地方很明显。

目标是创建一个隧道,将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

实际上从远程到主机的一些数据会很好。这就是 netcat 的用武之地。在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?

隧道正在运转!但是,如果您有一个名为 appname 的应用程序,该应用程序应该在本地计算机上侦听端口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。

答案 7 :(得分:1)

我们可以使用ps命令检查

# ps -aux | grep ssh

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

答案 8 :(得分:0)

#!/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)

如果您在后台使用ssh,请使用以下命令:

from Courses import Courses