Создание сценария.sh для проверки наличия SSH-соединения, а если нет, то для подключения

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

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

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

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

Если активное соединение не обнаружено, подключитесь, выполнив "ssh [email protected] -i key.priv" и выйдите из сценария.

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

Спасибо за ваши советы.

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

Если вы не хотите использовать Cron, измените скрипт 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 &
Другие вопросы по тегам