我是linux的初学者,也是ssh和隧道的新手。
无论如何,我的目标是在后台维护一个ssh隧道。
为了做到这一点,我编写了以下批处理,然后将其添加到crontab中(批处理在工作日期间每隔5分钟自动处理一次,从早上8点到晚上9点)。 我在stackoverflow中的其他一些线程中读到,应该使用autossh,这将确保通过循环检查确保ssh始终正常。我也是...... ....
#!/bin/bash
LOGFILE="/root/Tunnel/logBatchRestart.log"
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date & time of log
if ! ps ax | grep ssh | grep tunnelToto &> /dev/null
then
echo "[$NOW] ssh tunnel not running : restarting it" >> $LOGFILE
autossh -f -N -L pppp:tunnelToto:nnnnn nom-prenom@193.xxx.yyy.zzz -p qqqq
if ! ps ax | grep ssh | grep toto &> /dev/null
then
echo "[$NOW] failed starting tunnel" >> $LOGFILE
else
echo "[$NOW] restart successfull" >> $LOGFILE
fi
fi
我的问题是有时隧道停止工作,虽然每件事看起来都没问题(ps ax | grep ssh>结果显示了两个预期的任务:autossh主任务和ssh隧道本身)。我实际上知道这个问题导致隧道被第三方软件使用,一旦隧道不再响应就会触发错误。
所以我想知道如何按顺序改进我的批次它将能够检查隧道并重新启动它,如果它已经死了。我在there中看到了一些想法,但它是通过“autossh”提示得出的结论......我已经使用过了。因此,我没有想法......如果你们有任何人,我很乐意看看他们!
感谢您对我的问题和您(可能)的建议感兴趣!
答案 0 :(得分:12)
您可以执行以下操作
,而不是使用ssh
检查ps
进程
创建脚本,执行以下操作并通过crontab -e
#!/bin/sh
REMOTEUSER=username
REMOTEHOST=remotehost
SSH_REMOTEPORT=22
SSH_LOCALPORT=10022
TUNNEL_REMOTEPORT=8080
TUNNEL_LOCALPORT=8080
createTunnel() {
/usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:TUNNEL_REMOTEPORT $REMOTEUSER@$REMOTEHOST
if [[ $? -eq 0 ]]; then
echo Tunnel to $REMOTEHOST created successfully
else
echo An error occurred creating a tunnel to $REMOTEHOST RC was $?
fi
}
## Run the 'ls' command remotely. If it returns non-zero, then create a new connection
/usr/bin/ssh -p $SSH_LOCALPORT $REMOTEUSER@localhost ls >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo Creating new tunnel connection
createTunnel
fi
实际上,这个脚本会打开两个端口
请通过评论检查并向我发送更多问题
答案 1 :(得分:0)
(我将其添加为答案,因为没有足够的空间来发表评论)
好的,我设法让批处理运行以启动ssh隧道(我必须指定我的主机名而不是localhost才能触发它):
#!/bin/bash
LOGFILE="/root/Tunnel/logBatchRedemarrage.log"
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date et heure du log
REMOTEUSER=username
REMOTEHOST=remoteHost
SSH_REMOTEPORT=22
SSH_LOCALPORT=10022
TUNNEL_REMOTEPORT=12081
TUNNEL_SPECIFIC_REMOTE_PORT=22223
TUNNEL_LOCALPORT=8082
createTunnel() {
/usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:$SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:$TUNNEL_REMOTEPORT $REMOTEUSER@193.abc.def.ghi -p $TUNNEL_SPECIFIC_REMOTE_PORT
if [[ $? -eq 0 ]]; then
echo [$NOW] Tunnel to $REMOTEHOST created successfully >> $LOGFILE
else
echo [$NOW] An error occurred creating a tunnel to $REMOTEHOST RC was $? >> $LOGFILE
fi
}
## Run the 'ls' command remotely. If it returns non-zero, then create a new connection
/usr/bin/ssh -p $SSH_LOCALPORT $REMOTEUSER@193.abc.def.ghi ls >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo [$NOW] Creating new tunnel connection >> $LOGFILE
createTunnel
fi
然而,当隧道运行时以及当cron再次尝试重新启动批处理时,我得到了一些即时消息(下面)......听起来它听不到它。此外,由于我需要一些时间来获取证据,我还不能说如果隧道出来它会成功重启。
以下是批次第二次启动的响应。
bind:地址已经在使用channel_setup_fwd_listener:无法侦听 到端口:10022绑定:地址已在使用中 channel_setup_fwd_listener:无法收听端口:8082无法收听 请求本地转发。
答案 2 :(得分:-1)
您可以使用netcat测试连接并在必要时打开它:
while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 rene@lg; done