2010-01-20 23:33:01 +0000 2010-01-20 23:33:01 +0000
236
236

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

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

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

Итак, есть ли способ предотвратить/восстановить терминал от подключений по ssh, которые имеют тайм-аут?

Ответы (7)

259
259
259
2010-01-20 23:53:48 +0000

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

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

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

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

Чтобы включить его для всех хостов:

Host *
  ServerAliveInterval 240

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

250
250
250
2010-01-20 23:44:01 +0000

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

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

39
39
39
2012-07-03 01:28:14 +0000

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

12
12
12
2014-02-06 14:13:27 +0000

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

6
6
6
2016-02-12 22:45:27 +0000

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

Файл: /etc/ssh/ssh_config

Содержимое:

ClientAliveInterval XX
ClientAliveCountMax YY

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

Извлекается из: http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

2
2
2
2015-12-17 02:19:43 +0000

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

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

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

Host *
   ConnectTimeout 0
0
0
0
2020-01-24 11:55:41 +0000

В моем случае проблема была в большом MTU. Вы можете поменять MTU на роутере, если используете NAT, но я меняю MTU на сервере:

sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart

На Windows вы также можете увеличить этот ключ:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010