Способ избежать тайм-аута ssh-соединения и зависания терминала GNOME


235

Когда я подключаюсь через ssh к определенным серверам, он отключается и «замораживает» терминал (не принимает ввод, не отключается, не может нажать Ctrl-C, чтобы убить процесс ssh или что-либо еще).

Это в Ubuntu, gnome-terminalхотя, кажется, оно приостанавливает ввод / вывод терминала и не влияет на работу самого программного обеспечения GNOME Terminal. Таким образом, меньше ошибок, gnome-terminalчем раздражающего несоответствия с ssh.

Итак, есть ли способ предотвратить / восстановить терминал по ssh-соединениям, для которых истекло время ожидания?


Ответы:


256

sshd (сервер) закрывает соединение, если какое-то время ничего не слышит от клиента. Вы можете указать своему клиенту время от времени отправлять на сервер сигнал о наличии знака.

Конфигурация для этого находится в файле ~/.ssh/config. Чтобы каждые четыре минуты отправлять сигнал на удаленный хост, укажите в своем поле следующее ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Это то, что у меня есть в моем ~/.ssh/config.

Чтобы включить его для всех хостов, используйте:

Host *
  ServerAliveInterval 240

Также обязательно запустите chmod 600 ~/.ssh/config, потому что файл конфигурации не должен быть доступен для чтения всем.


1
Спасибо sblair за помощь в формулировке, это очень ценится. Я изменил «не должен» обратно на «не должен», потому что ssh проверяет права доступа к файлу, и если он доступен для чтения в мире или группе, он не работает.
Людвиг Вайнцерль

1
Это не то, что спросил ОП. Его не выгнали из-за бездействия. Он пытается подключиться, и его терминал зависает.
Церин

Где это ~/.ssh/config?
Пользователь

1
@User '~ /' представляет вашу домашнюю папку. «.ssh» - это папка в вашей домашней папке.
2015 г., 12:45

6
это бесполезно, если ваша связь на самом деле теряется ...
so12311

248

Нажмите Enter, ~, .один за другим , чтобы отключиться от замерзшего сессии.

Раздел «ESCAPE CHARACTERS» на странице руководства ssh объясняет основные детали.


40
Этот ответ кажется мне более точным ответом на вопрос, и в любом случае это был ответ, который я искал.
CoatedMoose

Обратите внимание , что вам нужно раскомментировать строку EscapeChar ~в /etc/ssh/ssh_config(или , ~/.ssh/ssh_configесли вы предпочитаете).
Адитья депутат

@adityamenon Нет, EscapeChar ~уже встроенный по умолчанию.
Питер Айзентро

2
@ Отметьте вопрос "есть ли способ предотвратить восстановление терминала из-за тайм-аута соединений ssh ?" Акцент мой.
CoatedMoose

2
Хотя это было неправильно в контексте вопроса, это именно то, что я хотел.
Субин Себастьян

38

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

По сути, когда вы входите в систему на SSH-сервере, вы сразу же запускаете, screenкоторый создает и присоединяет новый сеанс:

$ screen

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

$ screen -ls

Чтобы присоединить к сеансу:

$ screen -r <session>

где <session>PID или имя сеанса. Вы будете повторно подключены к вашей сессии, и вы можете продолжить с того места, где остановились!

Вы даже можете отменить сеанс и восстановить соединение с домом, чтобы забрать с точной точки, где вы остановились. Чтобы отсоединить сеанс, который вы используете C-a, C-dследуйте (вот Control + Aи потом Control + D).

Существует также простое онлайн-руководство .

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


2
другая альтернатива - использовать mosh
Zombies

Это особенно полезно, если вы используете точку доступа или Wi-Fi, которые иногда выпадают.
Рэндалл

11

Попробуйте добавить -o ServerAliveInterval=30в строку подключения ( 30означает 30 секунд и, конечно, может быть скорректирована)


5

Вы также можете установить интервал простоя со стороны сервера SSH:

Файл: /etc/ssh/ssh_config

Содержание:

ClientAliveInterval XX
ClientAliveCountMax YY

Это работает точно так же, как настройки клиента, но нулевые пакеты отправляются с сервера, а не с клиента.

Извлечен из:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html


1

Для людей, которые в первую очередь хотят предотвратить тайм-аут клиента.

Вы можете попытаться установить ConnectTimeout 0в файле конфигурации. Значение 0 означает, что соединение будет поддерживаться в течение неопределенного времени, если оно не закрыто.

Ваш файл конфигурации (или ssh_config) может выглядеть так:

Host *
   ConnectTimeout 0
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.