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

ssh:检查隧道是否处于活动状态,ssh,tunneling,ssh-tunnel,Ssh,Tunneling,Ssh Tunnel,我编写了一个需要ssh隧道从远程服务器提取数据的程序,因此它会提示用户: echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'" 我想检查用户是否已打开此隧道,如果不存在隧道,则退出时显示错误消息。是否有任何方法可以查询ssh隧道,即检查本地端口6000是否真的通过隧道连接到该服务器?这实际上是一个服务器故障类型的问题,但您可以使用netstat 比如: # netstat -lpnt |

我编写了一个需要ssh隧道从远程服务器提取数据的程序,因此它会提示用户:

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

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

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

比如:

 # netstat -lpnt | grep 6000 | grep ssh
这将告诉您指定端口上是否有ssh进程在侦听。它还将告诉您流程的PID

如果您真的想仔细检查ssh进程是否使用了正确的选项启动,那么可以通过PID在下面的内容中查找该进程

# ps aux | grep PID

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

# $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

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

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

例如:

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

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

Netcat是你的朋友:

nc -z localhost 6000 || echo "no tunnel open"
#/bin/bash
#检查我们是否有到example.com服务器的隧道
lsof-itcp@localhost:6000>/dev/null
#如果退出代码不是0,则隧道不存在。
如果[$?-等式1]
然后
你错过了ssh隧道。创建一个..'
ssh-L 6000:localhost:5432 example.com
fi
做你的事<'

这些是测试或排除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:~# nc -l 127.0.0.1:456
要检查流程是否正在运行,我们可以执行以下操作:

local:~# ps aux | grep ssh
如果您在输出中看到命令,我们可以继续。否则,请检查SSH密钥是否安装在远程服务器中。请注意,如果在远程IP之前排除用户名,ssh将使用当前用户名

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

remote:~# netstat | grep 10.0.0.1
remote:~# nc 127.0.0.1 123
remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?
我们应该得到与此类似的输出:

tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED
如果能看到从远程到主机的一些数据,那就太好了。这就是netcat的用武之地。在CentOS上,它可以通过
yum install nc
安装

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

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12
local:~# nc -l 127.0.0.1:456
然后在远程设备上建立连接:

remote:~# netstat | grep 10.0.0.1
remote:~# nc 127.0.0.1 123
remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?
如果打开本地计算机的第二个端子,则可以看到连接。大概是这样的:

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:~# netstat | grep 10.0.0.1
remote:~# nc 127.0.0.1 123
remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?
您应该会看到本地终端上镜像了这一点:

local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?
隧道在运行!但是,如果您有一个名为appname的应用程序,该应用程序应该在本地计算机的端口456上侦听,该怎么办?在两侧终止nc,然后运行应用程序。您可以通过以下方式检查它是否在正确的端口上侦听:


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

我们可以使用ps命令进行检查

# ps -aux | grep ssh

将显示所有正在运行的shh服务,我们可以找到列出的隧道服务。如果您在后台使用ssh,请使用以下命令:

sudo lsof -i -n | egrep '\<ssh\>'
sudolsof-i-n | egrep'\'

哇,这真是太有用了。我正在编写一个脚本,首先创建一个ssh隧道,现在我正在使用netcat了解它何时准备好接受连接。工作起来很有魅力。请注意,此解决方案在OS X上不起作用,因为OS X上的netstat是不同的。上面的代码中似乎有一个bug。如果[$?-ne 0],则0可能是1。远程egrep将设置$?如果成功找到匹配项,则返回0。在任何情况下,每次运行该命令时,我都需要使用1来让该命令停止终止现有隧道。这可能对“lsof-I | grep ssh”有部分帮助