【问题标题】:How to set up an automatic (re)start of a background ssh tunnel如何设置后台 ssh 隧道的自动(重新)启动
【发布时间】:2011-10-09 04:33:03
【问题描述】:

我是 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 主任务和 ssh 隧道本身)。我实际上知道这个问题,因为隧道被第三方软件使用,一旦隧道不再响应,就会触发错误。

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

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

【问题讨论】:

标签: linux batch-file ssh


【解决方案1】:

您可以执行以下技巧,而不是使用 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,这是您可能要使用的端口

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

【讨论】:

  • 嗨 Marvin,如果我的回答帮助您解决了问题,请投票并接受这个回答 - 这将提高您和我在 stackoverflow 中的声誉。
  • 我试过但遇到了一些问题: *我对端口感到困惑;远程端口不应该相同,无论本地端口是什么? *还有关于端口:我以前使用的 ssh 命令中有这个选项“-p $SOME_PORT”;这会覆盖 $REMOTE_PORT 还是这是一些附加端口,您是否故意避免提及它?最终,我从(固定)批次返回时得到了这个:ssh:无法解析主机名[MyHostName]:名称或服务未知。主机名是正确的,但似乎无法在端口 22 上进行隧道侦听器):我错过了 stg 吗?
  • 再一次,我点击得太快了。是的,这很有帮助,因为多亏了你,我现在对这个问题不那么无知了!
  • 选项-p $SOME_PORT用于建立ssh连接。通常这是端口 22,但使用此选项,您可以更改它。像-L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT 这样的语句负责隧道端口,在本地和远程端不能相同。所以-L10022:localhost:22 会将远程系统的 22 端口通过隧道连接到本地计算机的 10022。之后,您也可以使用ssh localhost -p 10022 访问服务器,假设端口 22 是 ssh 端口。
【解决方案2】:

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

好的,我设法让批处理运行以启动 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 无法 请求本地转发。

【讨论】:

  • 您收到的地址正在使用消息是因为您从脚本中删除了检查隧道是否已在运行的部分。 pgrep -fl $SSH_LOCALPORT:$REMOTEHOST:$SSH_REMOTEPORT 会显示第一次运行的 ssh 仍在运行。
猜你喜欢
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2020-01-24
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2015-08-26
相关资源
最近更新 更多