Как настроить автоматический (пере) запуск фонового ssh-туннеля - PullRequest
6 голосов
/ 20 июля 2011

Я начинающий пользователь Linux, а также довольно новичок в ssh и туннелях.

В любом случае, моя цель - поддерживать открытый ssh-туннель в фоновом режиме.

Для этого я написал следующую партию, которую затем добавил в crontab (эта партия автоматически обрабатывается каждые 5 минут в рабочие дни и с 8:00 до 21:00). Я прочитал в другом потоке в 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). Я действительно знаю о проблеме, потому что туннель используется сторонним программным обеспечением, которое вызывает ошибку, как только туннель больше не отвечает.

ТАК, мне интересно, как мне улучшить свою партию, чтобы она могла проверить туннель и перезапустить его, если он окажется мертвым. Я видел некоторые идеи в там , но он был заключен в подсказке "autossh" ... которую я уже использую. Таким образом, у меня нет идей ... Если у кого-то из вас есть, я бы с удовольствием посмотрел на них!

Спасибо за интерес к моему вопросу и за ваши (возможно) предложения!

Ответы [ 3 ]

12 голосов
/ 21 июля 2011

Вместо проверки процесса ssh с помощью ps вы можете выполнить следующий трюк

create script, который делает следующее и добавляет его в ваш crontab с помощью 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

На самом деле, этот скрипт откроет два порта

  • порт 22, который будет использоваться для проверки того, что туннель еще жив
  • порт 8080 - это порт, который вам может понадобитьсяиспользовать

Пожалуйста, проверьте и отправьте мне дополнительные вопросы через комментарии

0 голосов
/ 23 июня 2014

Вы можете использовать netcat для проверки соединения и при необходимости открыть его:

while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 rene@lg; done
0 голосов
/ 25 июля 2011

(я добавляю это как ответ, так как недостаточно места для него и комментария)

Хорошо, мне удалось запустить пакет для запуска туннеля 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 Не удалось запросить локальную переадресацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...