Создание .sh сценария, чтобы проверить, существует ли соединение SSH и если не затем соединяются

Я борюсь с записью, что я принимаю, должен быть легкий сценарий.

В основном у меня есть компьютер на работе, которая скрыта позади NAT, к которому у меня нет доступа. Мне нужно к SSH в этот компьютер, таким образом, единственный способ сделать это должно установить обратное перенаправление порта, где этот компьютер NATted соединится с моим сервером дома при перенаправлении порта для него сам, и затем я могу просто ssh в него через мой домашний сервер.

.sh сценарий будет выполняться компьютером на работе каждые 5 минут, и это - то, что я хотел бы, чтобы это сделало:

Проверьте, существует ли активное соединение SSH к моему продолжению сервера и если да, то просто ничего не делают и выходить из сценария.

Если нет никакого обнаруженного активного соединения, то соединитесь путем выполнения "ssh me@1.2.3.4-i key.priv" и выйдите из сценария.

Если попытка соединения SSH зависает по некоторым причинам, для говорят дольше, чем 2 минуты, то вызывают, выходят из сценария (не уверенный, если это возможно сделать, в противном случае затем это не должно быть там),

Большое спасибо за Ваш совет.

3
задан 26 April 2018 в 12:25

1 ответ

Давайте предположим использование следующей команды для установления соединения SSH (я предпочел бы использовать .ssh/config файл, который упростит команду ssh, но это не обязательно):

ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa
  • опции -fTN отодвинет соединение на задний план - я записал эту ведущую роль, потому что этот набор опций очень важен для моего предложения ниже;
  • опция -R 2222:127.0.0.1:22 создаст обратный туннель;
  • опция -i $HOME/.ssh/id_rsa указывает на файл идентификационных данных.

Мы можем использовать ps -aux | grep "<our command>" | sed '$ d' проверять, устанавливается ли соединение или нет. На основе этого нашего сценария мог быть:

#!/bin/bash
SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then exec $SSH_COMMAND
fi

Назовите этот сценарий my_autossh, поместите его в ~/bin и сделайте это исполняемым файлом. Затем выполненный crontab -e и добавьте следующее задание:

* * * * * $HOME/bin/my_autossh

Если Вы не хотите использовать Крон, измените документ на получение my_autossh таким образом:

#!/bin/bash
SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

while true; do
    if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
    then eval $SSH_COMMAND
    else sleep 60
    fi
done

И используйте nohup отодвинуть его на задний план:

nohup my_autossh >/dev/null 2>&1 &

Чтение также:

3
ответ дан 1 December 2019 в 16:18

Другие вопросы по тегам:

Похожие вопросы: