Создание сценария.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 &