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

157695
Kzqai

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

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

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

219
Возможный дубликат [Как надежно поддерживать открытый туннель SSH?] (Https://superuser.com/questions/37738/how-to-reliably-keep-an-ssh-tunnel-open) Murmel 6 лет назад 0

6 ответов на вопрос

247
Ludwig Weinzierl

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

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

Host remotehost HostName remotehost.com ServerAliveInterval 240 

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

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

Host * ServerAliveInterval 240 

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

Спасибо sblair за помощь в формулировке, это очень ценится. Я изменил «не должен» обратно на «не должен», потому что ssh проверяет права доступа к файлу, и если он доступен для чтения в мире или группе, он не работает. Ludwig Weinzierl 13 лет назад 1
Это не то, что спросил ОП. Его не выгнали из-за бездействия. Он пытается подключиться, и его терминал зависает. Cerin 10 лет назад 1
Где это `~ / .ssh / config`? User 10 лет назад 0
@User '~ /' представляет вашу домашнюю папку. «.ssh» - это папка в вашей домашней папке. wkm 9 лет назад 1
это бесполезно, если ваша связь на самом деле теряется ... so12311 9 лет назад 5
235
Peter Eisentraut

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

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

Этот ответ кажется мне более точным ответом на вопрос, и в любом случае это был ответ, который я искал. CoatedMoose 11 лет назад 38
Обратите внимание, что вам нужно раскомментировать строку `EscapeChar ~` в `/ etc / ssh / ssh_config` (или` ~ / .ssh / ssh_config`, если вы предпочитаете). Aditya M P 11 лет назад 0
@adityamenon Нет, `EscapeChar ~` уже встроен по умолчанию. Peter Eisentraut 11 лет назад 0
Хм, это не работало для меня в Ubuntu 12.04, пока я не нашел эту строку и не раскомментировал ее ... Aditya M P 11 лет назад 0
@CoatedMoose В заголовке вопроса спрашиваются способы избежать тайм-аута ssh-соединения; это способ разорвать соединение после его замораживания. Это очень полезный трюк, но не более точный ответ на вопрос. Mark 9 лет назад 0
@ Отметьте вопрос "есть ли способ предотвратить восстановление терминала из ssh-соединений __, которые истекли по времени?" Акцент мой. CoatedMoose 9 лет назад 2
Несмотря на то, что это было неправильно в контексте вопроса, это именно то, что я хотел. Subin Sebastian 8 лет назад 2
Это одна из самых полезных команд для любого, кто обращается к удаленным компьютерам с ноутбука / Wi-Fi! James McCormac 7 лет назад 0
Есть ли способ превратить эту последовательность в ярлык, так что я просто нажимаю что-то вроде `ctrl-alt-c` или что-то в этом роде? gone 7 лет назад 0
38
fotos

Даже если это не прямой ответ на ваш вопрос, он тесно связан с вашей проблемой. Вместо того, чтобы пытаться держать соединение (все соединения в конце концов умирают), вы можете использовать терминальные мультиплексоры, как 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сеанс.

другая альтернатива - использовать mosh: https://mosh.mit.edu/ Zombies 8 лет назад 1
Это особенно полезно, если вы используете точку доступа или Wi-Fi, которые иногда выпадают. Randall 8 лет назад 0
11
Fergie

Try appending -o ServerAliveInterval=30 to your connection string (30 means 30 seconds and can of course be adjusted)

5
Ladinfremes

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

Файл: /etc/ssh/ssh_config

Содержание:

ClientAliveInterval XX ClientAliveCountMax YY 

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

Извлеченный из:

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

1
Yohannes Libanos

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

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

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

Host * ConnectTimeout 0 

Похожие вопросы