Как я могу предотвратить зависание сессии SSH в Терминале OS X?

101

Когда я закрываю свой MacBook с активным сеансом SSH в Терминале, а затем просыпаюсь, приглашение перестает отвечать на запросы.

Примерно через пять минут он говорит

Write failed: Broken pipe

и заканчивается.

Это также происходит, когда я ничего не печатаю в Терминале примерно через пятнадцать минут.

Могу ли я заставить OS X:

  1. Поддерживайте подключение SSH как можно дольше
  2. Убей его немедленно, как только он перестанет отвечать

?

Дэн
источник

Ответы:

121

Чтобы сохранить соединение живым , вы можете проверить в /etc/ssh/ssh_configстроке, где оно говорит ServerAliveInterval, говорит вам, как часто (в секундах) ваш компьютер будет отправлять нулевой пакет, чтобы поддерживать соединение живым. Если у вас есть 0, это указывает на то, что ваш компьютер не пытается поддерживать соединение активным (оно отключено), в противном случае он сообщает вам, как часто (в секундах) он отправляет вышеупомянутый пакет. Попробуйте ввести значение 120 или 240, если оно все еще убивает ваше соединение, вы можете понизиться, может быть до 5, если с этим номером этого не произойдет, возможно, именно ваш маршрутизатор сбрасывает соединение в свободную память.

Чтобы убить его, когда он зависнет , вы можете использовать escape-символ ssh:

~.

То есть, нажмите тильду, а затем точку, если она не работает, нажмите Enter перед тем, как нажать, что немедленно прервет соединение.

Хорхе Нуньес
источник
3
Хорошо, вы можете разорвать связь ~., отличный совет! Но что это на самом деле делает?
Кузен Кокаин
Единственное, что меня смутило, было ли мне нужно перезапустить sshd или нет, но похоже, что выход из сеанса и повторное подключение сделали
свое дело
Часто ~. не работает для меня в течение нескольких минут. Почему это?
Шридхар Сарнобат
2
Расположение ssh_configнаходится /etc/ssh/ssh_configна Mac OS X. Я бы редактировать Ответ на этот вопрос сам, но я не хватает респ на этом сайте , чтобы сделать это.
Эрик Б
я должен положить это в клиент или сервер? Я думаю, что клиент, но может быть понятнее.
EralpB
23

Ты можешь:

Сконфигурируйте свою систему для всей системы для всех соединений. Отредактировав : / etc / ssh / ssh_config и добавив строку:

ServerAliveInterval 10

Или для каждого сервера ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Что это в основном делает, отправляет пакет live keep каждые 10 секунд ...

Александар Павич
источник
9

Вы также можете попробовать использовать удивительный проект mosh . Он будет корректно обрабатывать потери в сети, отключать машины и т. Д. И успешно восстанавливать соединение, когда у вас снова будет рабочая сеть.

Еще одно проверенное временем решение - использовать tmux на удаленной машине. В этом случае вы все равно можете получить сломанный канал, но если вы переподключите свою оболочку, приложения будут ждать, как только вы их покинули.

BinaryPaean
источник
На самом деле, это именно то, что я делаю сейчас.
Дан
5

Различные ответы здесь противоречат точному пути к файлам конфигурации. Может в разных юниксах по-разному? Я предлагаю прочитать справочные страницы в вашей системе!

В man ssh (1) найдите текст: config . В моей системе у меня есть выбор файлов конфигурации для всей системы или для этого пользователя (и пути странно разные).

В man ssh_config (5) ищите текст: жив . В моей системе, похоже, мне нужно установить ServerAliveInterval и ServerAliveCountMax .

В macOS 10.12 Sierra у меня работает то, что я поместил следующие две строки в ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Теперь я могу подключиться к серверу Ubuntu 16.04 без отключения в течение 20 * 180 секунд = 1 час. Сделал мой день!

Джерри Кринок
источник
3

Автоматически переподключать SSH после прерывания сна или Wi-Fi

  1. Установите autossh из MacPorts или Homebrew:brew install autossh

  2. Откройте терминал и запустите autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Отключите Wi-Fi или переведите Mac в режим сна.

  4. Когда вы переподключитесь к Wi-Fi, сессия SSH будет автоматически переподключена.


Автоматически SSH после входа в систему

Джон Стейси написал в блоге сообщение об автоматической активации сеанса SSH при входе в систему.

  1. Установите autossh из MacPorts или Homebrew:brew install autossh

  2. Создайте рабочий процесс Automator с помощью bash-скрипта.

Сценарий оболочки Automator

  1. Перейдите к пунктам входа в Системные настройки .

Системные настройки> Элементы входа

  1. Добавьте ваш рабочий процесс Automator в элементы входа .

Элементы входа

Камил Словиковски
источник
1

Добавьте эти две строки в /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes
MOHRE
источник
1

Только что решил эту проблему, добавив следующие строки $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

Параметр TCPKeepAlive noуказывает клиенту просто предполагать, что соединение по-прежнему исправно, пока пользовательский запрос не подтвердит обратное, а это означает, что временные разрывы соединения, пока ваш термин ssh бездействует в фоновом режиме, не разрушают соединение.

Нур Рони
источник