терминал зависает при обрыве соединения и включенном ssh

18

когда я подключаюсь к серверу через Интернет на вкладке терминала gnome, если я потерял подключение к Интернету, вкладка терминала будет зависать и не принимать никаких входных данных. Почему это зависает?

Есть ли какой-нибудь способ активировать вкладку терминала, то есть заставить ее продолжить выполнение процесса локальной оболочки?

Является ли закрытие вкладки терминала единственным способом?

StackExchange для всех
источник

Ответы:

20

SSH соединение идет вниз автоматически по истечении определенного периода времени , установленного ClientAliveIntervalи ClientAliveCountMaxпараметров и их стороне клиента эквиваленты. Если эти таймауты достаточно велики, вы увидите замороженную раковину. Однако, если вы используете, OpenSSHвам не нужно ждать тайм-аут и можете принудительно закрыть соединение, используя escape-символы :

ESCAPE CHARACTERS
When a pseudo-terminal has been requested, ssh supports a number
of functions through the use of an escape character.  A single
tilde character can be sent as ~~ or by following the tilde by a
character other than those described below. The escape character
must always follow a newline to be interpreted as special. The
escape character can be changed in configuration files using the
EscapeChar configuration directive or on the command line by the
-e option.
The supported escapes (assuming the default ‘~’) are:

~.
    Disconnect.
(...)

Когда соединение замерзнет, ​​нажмите ~(что означает Shift+ `клавиши вместе), отпустите его и нажмите .. Кроме того, если вы работаете с нестабильным соединением или вам необходимо постоянно подключаться к удаленному серверу, вы можете использовать autossh для автоматического восстановления потерянного соединения, это очень удобно.

РЕДАКТИРОВАТЬ :

Однако, если оба ClientAliveIntervalи ServerAliveIntervalимеют значение 0 в явном или не заданы явно , а затем устанавливается в 0 по умолчанию в соответствии с sshd_configи ssh_configстраницы Справочника, настройки времени ожидания устанавливаются в следующих файлах (от http://tldp.org/HOWTO/TCP- Keepalive-HOWTO / usingkeepalive.html ):

  # cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200

  # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75

  # cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

  The first two parameters are expressed in seconds, and the last is
  the pure number. This means that the keepalive routines wait for
  two hours (7200 secs) before sending the first keepalive probe,
  and then resend it every 75 seconds. If no ACK response is
  received for nine consecutive times, the connection is marked as
  broken.

Вы можете изменить эти 3 файла, просто используя echoи убедившись, что замороженный сеанс SSH отключен в соответствии с этими значениями.

Аркадиуш Драбчик
источник
6
Я хотел бы добавить, что ssh распознает только escape-символ сначала или после Enter. Когда соединение ssh застревает, Enter часто, но не всегда, последний символ, который вы нажали ранее. Так что, вероятно, лучше привыкнуть к Enter ~ .последовательности, которая завершает соединение.
egmont
Благодарю. Я до сих пор не ясно , как /proc/sys/net/ipv4/tcp_keepalive*файлы и ClientAliveIntervalи ServerAliveInterval работать вместе? Они все для одних и тех же настроек, т.е. для поддержания связи через ssh? Эти файлы не только для ssh-соединений, но и для других TCP-соединений?
StackExchange для всех
Другой вопрос: почему: «Если эти таймауты достаточно велики, вы увидите замороженную раковину». Что вы подразумеваете под "тайм-ауты довольно высоки"? Разве оболочка не всегда заморожена, если не хватает активности в течение указанного периода времени? или вы имеете в виду, что в некоторых случаях отсутствия активности оболочка не блокируется, а завершается автоматически?
StackExchange для всех
@Tim: 1. /proc/sys/net/ipv4/tcp_keepalive*не только для, ssh(d)но и как сказано в документе, на который я Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface. There are relatively few programs implementing keepalive, but you can easily add keepalive support for most of them following the instructions explained later in this document.
ссылаюсь
@Tim: 2. Довольно высокий означает, например, 2 часа - вам придется ждать 2 часа, прежде чем сеанс будет отключен. Сделайте тест - соединитесь с удаленным хостом, убейте sshdна удаленном или удалите кабель и проверьте, когда замороженный ssh сеанс выйдет сам. К frozen shellI средней оболочки , которая является неактивным, не принимает никаких ключей и ничего не печатает.
Аркадиуш Драбчик