Как предотвратить отключение SSH, если он простоял некоторое время

51

У меня есть ssh-соединение с машиной, которая отключается этой машиной после 30 минут отсутствия ввода пользователя. Тем не менее, если я начну что-то вроде top, соединение остается в живых. Поскольку это клиентская машина, я не могу перенастроить SSH-сервер этой машины. Поэтому я ищу способ автоматически обнаружить безделье и начать что-то подобное top. Вид "заставки" для Bash.

Я знаю, что я могу сделать это с screen, но, к сожалению screen, не установлен, и я не могу установить программное обеспечение. Поэтому мне нужно использовать то, что предлагает Bash.

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

Любые идеи?

Исаак
источник
Просто быстрое замечание, чтобы очистить экран и Keepalive - это не одно и то же: например, если клиент ssh или сервер отключен, жест ssh будет прерван, даже если у вас включен KeepAlive, в то время как оболочка экрана не будет прервана ,
MariusMatutiae
Возможный дубликат Как надежно держать туннель SSH открытым?
Мурмель

Ответы:

78

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

Проблема в том, что есть что-то (обычно брандмауэр или балансировщик нагрузки), которое отбрасывает пустые сеансы. Если вы сконфигурируете сообщения активности сеанса, они будут препятствовать тому, чтобы сетевые устройства рассматривали сеанс как бездействующий.

Исправление для Linux / Unix / Cygwin OpenSSH :
самое простое исправление - включить поддержку активности клиента ssh; этот пример будет отправлять ssh keepalive каждые 60 секунд:

ssh -o "ServerAliveInterval 60" <SERVER_ADDRESS>

Если вы хотите включить это на всех ваших сессиях, укажите это в вашем /etc/ssh/ssh_configили ~/.ssh/config:

ServerAliveInterval 60

Для получения дополнительной информации см. ssh_configСправочную страницу

Замазка исправить :

Сохраните это в вашей PuTTY "Настройки по умолчанию" ...

  • Нажмите на соединение
  • Введите 60 в "Секунды между keepalive"

putty_screenshot

Майк Пеннингтон
источник
21

В дополнение к ответу Майка Пеннигтона , я бы хотел, чтобы вы знали об этом ServerAliveCountMax.

  • ServerAliveIntervalПошлет Keepalive каждые х секунд ( по умолчанию 0 , который отключает эту функцию , если не установлен на что - то другое).
  • Это будет сделано ServerAliveCountMaxраз, если ответ не получен. Значением по умолчанию ServerAliveCountMaxявляется 3 (см. Man-страницу ssh_config ).

Пример: если вы установите ServerAliveIntervalзначение 60 и оставите все ServerAliveCountMaxкак есть, это означает, что keepalive будет ждать только 3 * 60 = 180 seconds = 3 минуты, прежде чем выйти.

Чтобы увеличить это, например, до 2 часов попыток сохранить соединение живым, вы можете сделать:

По команде:

Поэтому вы должны рассмотреть возможность установить

ssh -o "ServerAliveInterval 60" -o "ServerAliveCountMax 120" <SERVER_ADDRESS>

Стойкие:

Чтобы сделать это постоянным, напишите это /etc/ssh/ssh_config(будет применяться в масштабе всей системы) или ~/.ssh/config(будет применяться только для пользователя):

ServerAliveInterval 60
ServerAliveCountMax 120

Заметка

Как правильно указал dislick , это может быть не тем, что вы хотите, в зависимости от вашей ситуации:

  • Если вы хотите быстро прекратить сеанс, как только сервер больше не отвечает, вам следует выбрать низкое значение для ServerAliveCountMax.
  • Если вы более заинтересованы в сохранении уже установленного соединения (например, вы едете на поезде и у вас высокая задержка), вам следует выбрать более высокое значение, ServerAliveCountMaxчтобы позволить sshпродолжать пытаться восстановить соединение.

Смотрите также:

Murmel
источник
1
Извините, но это неправильно. ServerAliveCountMaxуказывает количество живых сообщений сервера, которые могут быть отправлены без получения каких-либо сообщений от сервера. Если вы хотите , sshчтобы выйти после того, как она замерзает (так что вы можете перезапустить его) , вы должны действительно установить ServerAliveCountMaxна низкое число. Смотрите ссылку на страницу руководства .
dislick
@Dislick Мне пришлось немного подумать об этом, но я думаю, что вы правы в зависимости от контекста, поэтому я добавил примечание, чтобы подчеркнуть контекст.
Мурмель
2

Я использую Mobaxterm и также столкнулся с этой проблемой. Mobaxterm также поставляется с опцией, чтобы сохранить клиента живым, когда клиент простаивает. Перейти к Settings -> Configuration -> SSH. Есть раздел под названием SSH settings, отметьте опцию SSH keepalive. Тогда проблема должна исчезнуть.

введите описание изображения здесь

jdhao
источник
делает «SSH Keepalive» работать в бесплатной версии ... мой сеанс разъединение даже после проверки этого варианта
samshers
Да, это работает. У вашей проблемы могут быть другие причины.
jdhao