Сохранить сессию SSH [закрыто]


242

Я использую ssh -p8520 username@remote_hostдля входа на удаленный сервер.

вопрос :

Он всегда подключен и работает правильно, когда я нахожусь на рабочем месте. К сожалению, терминал зависает через 10 - 15 минут после того, как я подключился к удаленному серверу из дома.

На консоли нет отчета об ошибке / тайм-ауте, но курсор больше не может двигаться.

Когда войти w чтобы проверить логин пользователей, некоторые зомби-логин есть, и мне приходится их убивать вручную.

Это довольно раздражает. Может кто-нибудь помочь мне?


У меня было это тоже, я начал использовать screen. Может быть, это какая-то проблема с тайм-аутом.
мартин

@martin screenпомогает поддерживать работоспособность программы. К сожалению, иногда мне приходится работать на удаленном сервере :(
Хайфэн Чжан

Если вы запустите его без параметров, это даст вам оболочку.
мартин

Вы говорите screenтолько? Это может решить проблему потерянного соединения? Нет screen -S screenName? Я всегда использую экран с -Sи-r
Хайфэн Чжан

1
Нет, это не решает проблему, вы только избегаете потери работы в терминале. Если вы ничего не сделаете, он все равно замерзнет, ​​вы можете просто начать с того, с чего начали. Я имел в виду, что вы можете создать терминал, который вы всегда можете возобновить с помощью screen. Вы, кажется, уже знаете это;)
Мартин

Ответы:


451

Демон ssh (sshd), который запускается на стороне сервера, закрывает соединение со стороны сервера, если клиент отключается (т. Е. Не отправляет информацию). Чтобы предотвратить потерю соединения, проинструктируйте клиента ssh время от времени отправлять на сервер сигнал о пожизненном знаке.

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

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Чтобы разрешить отправку сигнала keep-alive для всех хостов, поместите в файл конфигурации следующее содержимое:

Host *
    ServerAliveInterval 240

24
@ user271996, почему нужно перезапустить демон для настройки на стороне клиента?
maxschlepzig

Конфигурация должна быть только для записи пользователем. удобочитаемость не является проблемой. Использование 600 в качестве вашего уровня разрешений хорошо, так как это только для записи пользователем.
Джбруни

1
на всякий случай неочевидно, что этот конфигурационный файл находится на вашем ПК / linux box
zzapper

5
Меня всегда смущает название конфигурации: клиент использует, ServerAliveInterval а сервер использует ClientAliveInterval . Какой беспорядок
youkaichao

@youkaichao Часто возникает путаница. Как разработчик API, есть причины, по которым я могу выразить это обоими способами. В конечном счете, самое важное, это хорошая документация выбранного стандарта.
Кэмерон Таклинд

171

Я хотел одноразовое решение:

ssh -o ServerAliveInterval=60 myname@myhost.com

Хранится в псевдониме:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

Теперь можно подключиться так:

me@MyMachine:~$ sshprod

12
Это круто, но не совсем "разовое решение". Если вы собираетесь подключиться к серверу более чем один раз, почему бы не сделать Host *и ServerAliveInterval 240(или указать имя хоста, если вы хотите только , myname@myhost.comкак в ответ rockymonkey555 в Настройка псевдонима не кажется , что проще никак?.
Lambart

8
Или просто создайте псевдоним в вашем ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Джабба

15
Он означает «один раз», как в «это работает только один раз», а не «я должен написать это только один раз».
Джонатан Хартли

1
Да, если вы прочитали «один раз» как «одноразовое использование», это отлично справится со своей задачей.
Philraj

Если вы хотите «один вкладыш» , который устанавливает ServerAliveIntervalв 60, большой. Однако использование псевдонима bash, когда это возможно, .ssh/configпросто глупо.
Кэмерон Таклинд

50

Для тех, кому интересно, @ edward-coast

Если вы хотите установить keep keep для сервера , добавьте это в /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : устанавливает интервал ожидания в секундах, после которого, если от клиента не было получено никаких данных, sshd (8) отправит сообщение через зашифрованный канал для запроса ответа от клиента.

ClientAliveCountMax : Устанавливает количество живых сообщений клиента (см. Ниже), которые могут быть отправлены без sshd (8) получения каких-либо сообщений от клиента. Если этот порог достигнут во время отправки клиентских живых сообщений, sshd отключит клиента, завершив сеанс.


Кажется, что нет такого «параметра», как ClientAliveInterval, только ServerAliveInterval, вы можете проверить на странице справочника «man ssh_config»
dtj

6
Это неверно, посмотрите в "man sshd_config" часть сервера, на которой запущен демон ssh, а не конфигурацию клиента.
Джефф Давенпорт

Должен ли я использовать, ClientAliveIntervalчтобы сервер проверял наличие клиента, или я должен позволить клиенту "пинговать" сервер ServerAliveIntervalнесколько раз? Оба, кажется, не имеют смысла
qrtLs

1
Установите параметр ClientAliveIntervalна сервере только в том случае, если вы хотите, чтобы сервер отключался от мертвых соединений, которые не отвечают, и вы можете настроить, как часто и когда это происходит.
Джефф Давенпорт


10

Мы можем поддерживать наше соединение ssh, следуя глобальным конфигурациям

Добавьте следующую строку в /etc/ssh/ssh_configфайл:

ServerAliveInterval 60

Это работает только для клиента или для sshd?
Эдвард Кост

1
@EdwardCoast Работает на клиентском компьютере. Я проверил это на Mac
minhas23
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.