Поддержание соединения SSH в течение более длительного времени

Поддержание соединения SSH в течение более длительного времени

4 июня 2022 г.

Несколько недель назад я работал над проектом, в котором был настроен пре-толкатель Husky. Поработав над ним несколько дней, я заметил, что иногда код не отправляется в удаленный репозиторий.


После головной боли проб и ошибок я понял, что хук pre-push занимает так много времени, чтобы закончить. И когда это произошло, не было сообщения о том, что код был отправлен в удаленное репо в терминале. Что-то было странным.


Я узнал, что SSH-соединение между терминалом и GitHub инициируется, когда мы выполняем git push, и завершается, когда код успешно проталкивается. Однако, если соединение неактивно в течение определенного периода времени, оно прерывается из-за тайм-аута.


Поскольку предварительная отправка Husky занимала так много времени, чтобы завершить свою работу, SSH-соединение с сервером GitHub истекло. Нерабочее соединение привело к тому, что код вообще не был отправлен.


Мне нужен был способ сохранить связь еще на несколько минут. К счастью, мы можем сделать это в самом терминале.


Предпосылки


Ваш терминал должен быть подключен к вашей учетной записи GitHub через SSH. Вы можете найти дополнительную информацию [здесь] (https://docs.github.com/en/authentication/connecting-to-github-with-ssh).


Решение


Как я уже сказал, решение состоит в том, чтобы сохранить связку живой, пока хаски не закончит свою задачу. Это проще, чем я думал.


В своем терминале перейдите в каталог, в котором хранится информация SSH. Обычно это папка /.ssh в домашнем каталоге. Выполните эту команду в терминале:


``` ударить


компакт-диск ~/.ssh


Символ тильды (\~) обозначает каталог /home. Поскольку желаемая папка назначения находится в самом домашнем каталоге, эта команда изменит текущий рабочий каталог на /home/.ssh.


Создайте файл с именем config без расширения. Добавьте в файл следующий текст:


Хозяин *


Серверживеинтервал 60


ServerAliveCountMax 30


ssh-config.gif


Подключитесь к хосту еще раз, и вы увидите успех. Если нет, увеличьте продолжительность на несколько минут, пока не найдете приятные моменты. Как понять этот параметр, объясняется в следующем разделе.


Объяснение


Но что на самом деле делают ServerAliveInterval и ServerAliveCountMax?


Согласно руководству по SSH:


ServerAliveInterval:


Устанавливает интервал времени ожидания в секундах, после которого, если данные не были получены от сервера, ssh отправит сообщение по зашифрованному каналу, чтобы запросить ответ от сервера. Значение по умолчанию равно 0, что указывает на то, что эти сообщения не будут отправляться на сервер. Этот параметр применяется только к протоколу версии 2.


ServerAliveCountMax:


Значение по умолчанию — 3. Если, например, для ServerAliveInterval установлено значение 15, а для ServerAliveCountMax оставить значение по умолчанию, если сервер перестанет отвечать, SSH отключится примерно через 45 секунд. Этот параметр применяется только к протоколу версии 2.


Итак, подведем итог:


  1. Клиент будет бездействовать в течение 60 секунд, т. е. времени ServerAliveInterval.

  1. Затем он отправит на сервер пустой нулевой пакет и ожидает ответа.

  1. Если ответ не приходит, он будет повторять описанный выше процесс до 30 раз, что определяется параметром ServerAliveCountMax. Таким образом, он будет ждать 1800 секунд, то есть полчаса.

  1. Если сервер по-прежнему не отвечает, клиент отключает соединение SSH.

Что нужно знать


Кто ждет ответа


В нашем случае клиент ждет ответа сервера. Потому что сервер GitHub отправляет ответ при отправке кода. Если вы хотите, чтобы клиент отправил ответ, вы должны использовать ClientAliveInterval и ClientAliveCountMax.


Разные настройки конфигурации для разных хостов


Символ звездочки (*) задает эту конфигурацию для каждого подключенного хоста. Если вы хотите установить это для определенного хоста или только для одного хоста, вы можете сделать это следующим образом:


Хост hostname1


Значение SSH_OPTION


Значение SSH_OPTION


Хост hostname2


Значение SSH_OPTION


Хозяин *


Значение SSH_OPTION


Список доступных подключенных хостов можно найти в файле known_hosts, расположенном в том же каталоге.


Подведение итогов


Сообщения об активности сервера полезны, когда сервер SSH настроен на закрытие соединений после периода отсутствия трафика. Установка этих двух параметров поддерживает сеанс, отправляя пакет каждые *ServerAliveInterval *seconds в течение максимум ServerAliveCountMax раз.


Как разработчик, мы сталкиваемся с новыми проблемами каждый божий день. Некоторые из этих проблем бросают вызов нашим навыкам; другие бросают вызов нашему терпению. Для меня эта проблема относится ко второй категории. Поэтому я решил написать статью об этом.


Я надеюсь, что вы нашли эту статью полезной. Если хотите поздороваться, мои личные сообщения всегда открыты. Я наиболее активен в [Twitter] (https://twitter.com/notifications), [LinkedIn] (https://www.linkedin.com/in/7JKaushal/) и [Showwcase] (https://www. showwcase.com/clumsycoder).


Удачного кодирования! 👨‍💻


Также опубликовано [здесь] (https://clumsycoder.hashnode.dev/how-to-keep-ssh-connection-alive-for-longer-durations).



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE