繁体   English   中英

如何设置自动(重新)启动后台 ssh 隧道

[英]How to set up an automatic (re)start of a background ssh tunnel

我是 linux 的初学者,也是 ssh 和隧道的新手。

无论如何,我的目标是保持 ssh 隧道在后台打开。

为此,我编写了以下批处理,然后将其添加到 crontab 中(该批处理在工作日和上午 8 点到晚上 9 点每 5 分钟自动处理一次)。 我在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 主任务和 Z1787D7646304C5D987CF4E64A39 隧道本身)。 我实际上知道这个问题,因为隧道被第三方软件使用,一旦隧道不再响应,就会触发错误。

所以我想知道我应该如何改进我的批次以便它能够检查隧道并在它碰巧死了时重新启动它。 我在那里看到了一些想法,但它是由“autossh”提示得出的……我已经使用过。 因此,我没有想法......如果你们中的任何人有,我很乐意看看它们!

感谢您对我的问题感兴趣,以及您的(也许)建议!

而不是用ps检查ssh进程,您可以执行以下技巧

创建脚本,执行以下操作并通过crontab -e将其添加到您的 crontab

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

其实这个脚本会打开两个端口

  • 端口 22 将用于检查隧道是否还活着
  • 端口 8080 这是您可能要使用的端口

请检查并通过评论向我发送更多问题

(我将其添加为答案,因为没有足够的空间进行评论)

好的,我设法使批处理运行以启动 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 bind:地址已在使用 channel_setup_fwd_listener:无法监听端口:8082 无法请求本地转发。

您可以使用 netcat 测试连接并在必要时打开它:

while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 rene@lg; done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM