221

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

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

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

6 ответов6

250

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

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

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

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

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

Host *
  ServerAliveInterval 240

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

238

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

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

37

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .