
Используя ssh, я вхожу в другую систему и выполняю там скрипты, которые создают новые машины, и делаю некоторые настройки. Это занимает около 7-8 часов. Так вот, соединение ssh постоянно обрывается, и я всегда получаю тайм-аут с неудачным выполнением скрипта.
Итак, теперь я использую этот аргумент вместе с ssh-подключением:
ssh -o ServerAliveInterval=60 user@host ....
Этот ssh создается несколько раз. Проблема в том, что после нескольких подключений ssh я получаю ошибку:
too many logins of user
и соединения after ssh закрываются сразу после успешного входа в систему.
Так же и поведениеServerAliveInterval, который сохраняет сеанс входа пользователя ssh на удаленной машине активным даже после завершения работы ssh, и поэтому мои дальнейшие входы отключаются?
решение1
Я не думаю, что это сохраняет сессию активной, если ваш клиент потерял соединение. Вероятно, это те опции на стороне сервера:
ClientAliveCountMax
Устанавливает количество сообщений о состоянии клиента, которые могут быть отправлены без получения sshd(8) каких-либо сообщений от клиента. Если этот порог будет достигнут во время отправки сообщений о состоянии клиента, sshd отключит клиента, завершив сеанс. Важно отметить, что использование сообщений о состоянии клиента сильно отличается от TCPKeepAlive. Сообщения о состоянии клиента отправляются по зашифрованному каналу и, следовательно, не могут быть подделаны. Параметр TCP keepalive, включенный TCPKeepAlive, подделан. Механизм состояния клиента полезен, когда клиент или сервер зависят от знания того, когда соединение стало неактивным.
Значение по умолчанию — 3. Если ClientAliveInterval установлен на 15, а ClientAliveCountMax оставлен по умолчанию, неотвечающие клиенты SSH будут отключены примерно через 45 секунд.
ClientAliveInterval
Устанавливает интервал тайм-аута в секундах, после которого, если данные не были получены от клиента, sshd(8) отправит сообщение через зашифрованный канал, чтобы запросить ответ от клиента. Значение по умолчанию — 0, что означает, что эти сообщения не будут отправлены клиенту.
Возможно, настоящее решение вашей проблемы заключается в использовании терминального мультиплексора, такого как screen или tmux. Они позволяют вашему входу в систему и запущенным программам сохраняться даже при обрыве соединения. Вы можете повторно подключиться к терминалу в любой момент позже, включая вывод запущенных программ. Также вы можете использовать его, чтобы иметь более одного терминала в вашем одном соединении ssh. Поскольку ваш сервер, похоже, ограничивает ваши сеансы ssh, это также может быть полезно. Вы можете найти одинвведение в экран здесь, но есть и множество других.
решение2
Так это поведение
ServerAliveInterval
, которое сохраняет сеанс входа пользователя SSH на удаленной машине активным даже после завершения работы SSH, и поэтому мои дальнейшие входы отключаются?
Нет. Это отправка сообщений keepalive, которые проверяют ваше подключение и предотвращают автоматические отключения в SSH или на более низких уровнях. Если вы хотите запустить долго работающие скрипты, вам следует использовать nohup
, screen
или tmux
на удаленной стороне. Это сохранит выполнение ваших скриптов даже после отключения, а с помощью вторых двух вы можете повторно подключить существующие терминалы.
решение3
Вероятно, вы получаете эти ошибки после включения, ServerAliveInterval=60
потому что ваши соединения остаются активными. Ваша схема ssh-подключений/команд к этому серверу накапливает больше одновременных подключений, чем разрешено в настройках сервера.
Раньше ваши соединения прерывались, из-за чего количество одновременных подключений уменьшалось, и сервер был этим доволен (нет отклоненных подключений), но вы были недовольны.
Узнайте конфигурацию сервера с точки зрения максимального количества одновременных подключений и либо оставайтесь в пределах этого лимита, либо договоритесь с администратором сервера об увеличении лимита для вас (или, возможно, даже для всех).