ssh:检查隧道是否存活

Ada*_*tan 36 ssh tunneling ssh-tunnel

我编写了一个小的bash脚本,它需要一个ssh隧道来从远程服务器中绘制数据,因此它会提示用户:

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"
Run Code Online (Sandbox Code Playgroud)

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

rxw*_*rxw 45

Netcat是你的朋友:

nc -z localhost 6000 || echo 'no tunnel open'
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 31

这是我的考验.希望它有用.

# $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
Run Code Online (Sandbox Code Playgroud)


小智 20

Autossh是最佳选择 - 检查过程在所有情况下都不起作用(例如僵尸进程,网络相关问题)

例:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2
Run Code Online (Sandbox Code Playgroud)


Igo*_*any 12

这实际上更像是一个serverfault类型的问题,但您可以使用netstat.

就像是:

 # netstat -lpnt | grep 6000 | grep ssh
Run Code Online (Sandbox Code Playgroud)

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

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

# ps aux | grep PID
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此解决方案在OS X上不起作用,因为OS X上的netstat不同. (3认同)

pla*_*aes 7

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