Привет, Хабр! Представим ситуацию: вы настраиваете сервер, работаете с критически важными процессами или изучаете логи — и внезапно SSH-соединение обрывается. Все не сохранённые изменения улетучиваются, прогресс откатывается, а вам приходится переподключаться и начинать всё заново.
В данной статье представлен скрипт-реаниматор для SSH, который:
-
Восстанавливает соединение при любых обрывах
-
Сохраняет рабочую сессию и историю команд
-
Поддерживает tmux/screen для полного сохранения контекста
-
Может отправлять уведомления о проблемах в Telegram
-
Решение представлено для Bash и PowerShell
Введение
SSH-реаниматор фактически является «обёрткой» вокруг SSH-клиента, которая:
-
Постоянно мониторит соединение
-
При обрыве делает паузу, пытается перезагрузиться и восстанавливает предыдущее окружение
-
Логирует все события, если потребуется анализ
Например: вы запускаете бэкап на 3 часа. Без реаниматора в случае обрыва Вам придётся начинать заново, но не в стиуации с реаниматором. Он восстановит создание бэкапа с прогрессом, на котором произошёл обрыв.
Важное уточнение: скрипт не является заменой полноценного решения в стиле Zabbix, Nagios и тд. Он лишь даёт простой и быстрый способ сделать рутинные подключения устойчивыми к сбоям. Может помочь, к примеру, в ситуации с какой-нибудь простенькой VPS, где Zabbix (и прочие) являются чересчур избыточными решениями.
Принцип работы SSH-реаниматора
1. Детектирование обрыва соединения
SSH использует 2 ключевых параметра для мониторинга активности соединения:
ServerAliveInterval (по умолчанию значение «0» — отключено)
-
Определяет интервал в секундах между keepalive-пакетами
-
Со стороны клиента отправляются пакеты для проверки активности сервера
ServerAliveCountMax (по умолчанию значение «3»)
-
Кол-во неудачных попыток проверки перед разрывом
-
Умножается на
ServerAliveIntervalдля получения общего таймаута
Посмотрим подробнее пример расчёта:
ssh -o ServerAliveInterval=20 -o ServerAliveCountMax=4 user@host
-
20 x 4 = 80 секунд без ответа
2. Механизм бесконечного переподключения
Скрипт, который будет описан ниже, использует цикл while true для постоянного поддержания соединения:
while true; do ssh -o ServerAliveInterval=30 user@host if [ $? -eq 0 ]; then break # Корректный выход else sleep 5 # Пауза перед повторной попыткой fi done
Ключевые моменты:
-
Проверка кода возврата SSH (0 — успех, иные — ошибка)
-
Задержка между попытками для избежания цикла быстрых переподключений
Bash-скрипт
#!/bin/bash SERVER="user@example.com" SSH_OPTS="-o ServerAliveInterval=30 -o ServerAliveCountMax=3" DELAY=5 while true; do echo "[$(date +'%H:%M:%S')] Подключение к $SERVER..." ssh $SSH_OPTS $SERVER if [ $? -eq 0 ]; then echo "[$(date +'%H:%M:%S')] Сессия завершена" break else echo "[$(date +'%H:%M:%S')] Ошибка соединения. Повтор через $DELAY сек..." sleep $DELAY fi done
Bash-скрипт с восстановлением tmux
#!/bin/bash SERVER="user@example.com" SESSION="remote_work" SSH_OPTS="-o ServerAliveInterval=30 -o ServerAliveCountMax=3" while true; do echo "[$(date +'%H:%M:%S')] Подключение к сессии $SESSION на $SERVER..." ssh -t $SSH_OPTS $SERVER "tmux attach -t $SESSION || tmux new -s $SESSION" if [ $? -eq 0 ]; then break else sleep 5 fi done
PowerShell-скрипт
$SERVER = "user@example.com" $SSH_OPTS = "-o ServerAliveInterval=30 -o ServerAliveCountMax=3" $DELAY = 5 while ($true) { Write-Host "[$(Get-Date -Format 'HH:mm:ss')] Подключение к $SERVER..." ssh $SSH_OPTS $SERVER if ($LASTEXITCODE -eq 0) { break } else { Start-Sleep -Seconds $DELAY } }
Как использовать
-
Сохранить скрипт:
nano ssh_reconnect.sh chmod +x ssh_reconnect.sh -
Запустить с логированием:
./ssh_reconnect.sh >> ssh_log.txt 2>&1 -
Запустить в фоновом режиме:
nohup ./ssh_reconnect.sh > /dev/null 2>&1 &
Также, ещё пара полезных функций:
-
Telegram-уведомления:
TELEGRAM_API="https://api.telegram.org/bot{TOKEN}/sendMessage" CHAT_ID="12345" MESSAGE="Ошибка SSH соединения с $SERVER" curl -s -X POST $TELEGRAM_API -d chat_id=$CHAT_ID -d text="$MESSAGE"
-
Автозапуск через crontab:
@reboot /path/to/ssh_reconnect.sh -
Сохранение истории команд:
ssh $SERVER "cat >> ~/.persistent_history"
Рекомендации
-
Для критически важных сессий используйте tmux или screen
-
Настройте оптимальные значения ServerAliveInterval для вашего соединения
-
Для долгоживущих сессий рассмотрите возможность использования terminal multiplexers
-
Включите логирование для анализа причин разрывов
Заключение
Представленные в статье скрипты помогут обеспечить надёжное поддержание SSH-соединения, восстановить сессию после обрывов и сохранить рабочее окружение. Решение можно допиливать и адаптировать под различные требования, расширять функционал.
P.S. Я веду свою группу в Телеграмм, буду рад видеть всех, кому интересен процесс написания скриптов и автоматизация в мире IT.
ссылка на оригинал статьи https://habr.com/ru/articles/927234/
Добавить комментарий