Поведение ServerAliveInterval при подключении по SSH

Вопрос или проблема

С помощью ssh я подключаюсь к другой системе и выполняю там скрипты, которые создают новые машины и настраивают их. Это занимает около 7-8 часов. Проблема в том, что соединение ssh постоянно обрывается, и я постоянно получаю таймаут с неудачным выполнением скрипта.

Теперь я использую этот аргумент вместе с соединением ssh:

ssh -o ServerAliveInterval=60 user@host ....

Это ssh создается несколько раз. Проблема заключается в том, что после нескольких подключений ssh я получаю ошибку:

слишком много входов пользователя и последующие соединения ssh закрываются сразу после успешных входов.

Такое поведение ServerAliveInterval, который поддерживает сессию входа пользователя ssh на удаленной машине, даже после завершения работы ssh, и поэтому мои дальнейшие входы отключаются?

Я не думаю, что это поддерживает сессию активной, если ваш клиент потерял соединение. Вероятно, это связано с параметрами на стороне сервера:

ClientAliveCountMax

Устанавливает количество сообщений о активности клиента, которые могут быть отправлены без получения каких-либо сообщений обратно от клиента. Если этот порог достигнут во время отправки сообщений о активности клиента, sshd отключит клиента, завершив сессию. Важно отметить, что использование сообщений о активности клиента сильно отличается от TCPKeepAlive. Сообщения о активности клиента отправляются через зашифрованный канал и, следовательно, не могут быть подделаны. Опция удержания TCP, включенная TCPKeepAlive, может быть подделана. Механизм активности клиента полезен, когда клиент или сервер зависят от того, чтобы знать, когда соединение стало неактивным.

Значение по умолчанию — 3. Если ClientAliveInterval установлено на 15, а ClientAliveCountMax оставлено по умолчанию, неоткликающиеся SSH-клиенты будут отключены примерно через 45 секунд.

ClientAliveInterval

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

(man sshd_config))

Возможно, реальное решение вашей проблемы заключается в использовании мультиплексора терминала, такого как screen или tmux. Они позволяют вашему входу и запущенным программам продолжать работать, даже если ваше соединение обрывается. Вы можете повторно подключиться к терминалу в любой момент, включая вывод запущенных программ. Также вы можете использовать его для того, чтобы иметь больше одного терминала в вашем едином соединении ssh. Поскольку ваш сервер, похоже, ограничивает ваши сессии ssh, это также может быть полезно. Вы можете найти одно введение в screen здесь, но есть много других источников.

Такое поведение ServerAliveInterval, которое поддерживает сессию входа пользователя ssh на удаленной машине, даже после завершения работы ssh, и поэтому мои дальнейшие входы отключаются?

Нет. Это отправка сообщений о поддержании связи, которые проверяют ваше соединение и предотвращают автоматическое отключение в SSH или на более низких уровнях. Если вы хотите запускать долгосрочные скрипты, вам следует использовать nohup, screen или tmux на удаленной стороне. Это позволит вашим скриптам продолжать работать даже после отключения, и при использовании последних двух вы сможете повторно подключиться к существующим терминалам.

Вы, вероятно, получаете эти ошибки после включения ServerAliveInterval=60 из-за того, что ваши соединения остаются активными. Ваша схема соединений/команд ssh к этому серверу накапливает больше параллельных соединений, чем сервер настроен позволять.

Ваши соединения раньше разрывались, что уменьшало количество параллельных соединений, и сервер был удовлетворен этим (не было отклоненных соединений), но вы не были довольны.

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

Ответ или решение

Поведение параметра ServerAliveInterval в SSH-соединении

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

Объяснение параметра ServerAliveInterval

Параметр ServerAliveInterval управляет отправкой сообщений "живости" на сервер через определенные интервалы времени (в данном случае каждую минуту). Это помогает поддерживать соединение активным, предотвращая разрывы, которые могут происходить из-за таймаута. Однако если ваши скрипты работают очень долго и вы используете несколько SSH-соединений одновременно, то вы можете столкнуться с ограничениями на количество параллельных соединений для данного пользователя на сервере.

Причины возникших проблем

  1. Число активных соединений: Каждое новое SSH-соединение, которое вы устанавливаете, может увеличивать общее число активных соединений. Сервер имеет ограничение на максимальное число активных соединений от одного пользователя (это параметр, как правило, настраиваемый в файле конфигурации sshd_config на сервере). Когда вы назначаете ServerAliveInterval, ваши соединения могут оставаться открытыми дольше, что приводит к превышению этого предела.

  2. Параметры ClientAlive: Параметры, такие как ClientAliveCountMax и ClientAliveInterval, на стороне сервера также могут играть роль. Если сервер не получает ответов от клиента в течение установленного времени, сеанс клиента будет разорван.

  3. Неправильное использование SSH для долгосрочных задач: Для долгих работ, которые могут потребовать нескольких часов, рекомендуется использовать инструменты, такие как screen или tmux, что позволяет запустить скрипт в сессии, которая останется активной на сервере даже если ваше SSH-соединение будет разорвано.

Рекомендации для решения проблемы

  1. Использование screen или tmux: Это инструменты, которые позволяют создавать виртуальные терминалы. Вы можете запустить ваши скрипты в одной из сессий screen или tmux, что позволит вам легко подключаться к этой сессии, даже если соединение разорвется. Это также снизит нагрузку на количество открытых соединений.

    Пример использования:

    # Вход в tmux
    tmux
    
    # Запуск вашего скрипта
    ./ваш_скрипт.sh
    
    # Отключение от сессии tmux
    Ctrl+b затем d
  2. Проверка параметров конфигурации SSH на сервере: Обратитесь к администратору сервера, чтобы узнать о текущих лимитах на количество соединений и, возможно, увеличить этот лимит для вашего пользователя, если это возможно.

  3. Использование nohup: Для выполнения длительных задач вы также можете использовать nohup, который позволяет запустить команды в фоновом режиме, игнорируя сигналы, связанные с выходом из системы.

    Пример использования nohup:

    nohup ./ваш_скрипт.sh &

Заключение

Использование параметра ServerAliveInterval не является причиной того, что соединения остаются открытыми долго. Вместо этого, использование средств управления терминалами, таких как screen или tmux, а также внимательное отношение к количеству одновременно активных соединений решит вашу проблему и позволит вам без проблем выполнять длительные задачи.

Оцените материал
Добавить комментарий

Капча загружается...