2012-05-19 5 views
20

Можно ли сохранить сеанс SSH во время сна компьютера? Когда я положил свой Mac (Lion) в течение короткого промежутка времени, а затем разбудил сессию еще живым, но если я оставлю ее в одночасье, соединение будет закрыто.Сохранять сеанс SSH во время сна компьютера?

Я пробовал множество:

 
ClientAliveInterval 3600 
ClientAliveCountMax 10 

же результат

Почему сессия "выжить" в течение короткого периода времени? Как я могу контролировать этот тайм-аут?

ответ

13

Я нашел ответ, это зависит от настроек поддержки активности TCP:

Для списка доступных параметров TCP (FreeBSD 4.8 и 5.4):

sysctl -A | grep net.inet.tcp 
  • net.inet.tcp.keepidle - количество времени в миллисекундах, что) соединение (TCP должен быть неактивным до пр оставайся в живых отправляются сообщения (если разрешено).

  • net.inet.tcp.keepintvl - Интервал в миллисекундах между датчиками keepalive, отправленными на удаленные машины. После отправки пробников TCPTV_KEEPCNT (по умолчанию 8), без ответа, соединение (TCP) будет удалено.

  • net.inet.tcp.always_keepalive - Предположим, что SO_KEEPALIVE установлен во всех TCP-соединениях, ядро ​​периодически отправляет пакет на удаленный хост, чтобы проверить, что соединение все еще включено.

Поэтому формула для вычисления максимального времени TCP неактивного соединения имеет следующий вид:

net.inet.tcp.keepidle + (net.inet.tcp.keepintvl x 8) 

результата в миллисекундах. Поэтому, установив

net.inet.tcp.keepidle = 10000 net.inet.tcp.keepintvl = 5000 net.inet.tcp.always_keepalive = 1 (must be 1 always) 

система будет отключить вызов, когда соединение TCP мертв для: 10000 + (5000 x 8) = 50000 мс (50 сек).Чтобы система запомнила эти настройки при запуске, вы должны добавить их в файл /etc/sysctl.conf.

+2

Следует ли это применять на стороне сервера? – netvope

+0

Я не пробовал, но я думаю, что да, на стороне сервера: [TCP Keepalive] (http://jampad.net/Library/tcpipprot/ch17.html): Если пользователь должны были установить соединение, выполните некоторую работу, затем просто выключите компьютер в конце дня, не отпуская, будет открыто полуоткрытое соединение. Если клиент исчезает, оставляя полуоткрытое соединение на сервере, а сервер ждет некоторых данных от клиента, сервер будет ждать всегда. Функция keepalive предназначена для обнаружения этих полуоткрытых соединений со стороны сервера. –

+0

Возможно ли иметь прокси для моей спящей системы, которая могла бы отправлять пакеты на сервер? Таким образом, сеанс можно было сохранить даже после сна. – sudeepdino008

1

Иногда сеансы закрываются, когда данные не передаются. Выход htop open обычно предотвращает закрытие моих соединений ssh, а также предоставляет полезную информацию в реальном времени.

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

+0

Если компьютер не спит, сеансы SSH прекрасны, но я хочу повторно использовать тот же сеанс после его просыпания после сна. Он работает на короткое время сна, но не надолго. –

+1

Вероятно, вы не можете держать сессию ssh открытой во время спящего режима - keepalive не будет отправлен, если компьютер спит. Экран - это путь: http://www.gnu.org/software/screen/ – Gyscos

6

Если вам нужно элегантное решение для сохранения удаленного сеанса, вы должны проверить его на screen. При использовании этой утилиты вы можете поддерживать работу своих удаленных программ даже после выхода из системы или выключения компьютера. Затем вы можете снова подключить свой доступный сеанс screen.

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

Вы можете проверить эту ссылку на учебник по использованию экрана: http://www.thegeekstuff.com/2010/07/screen-command-examples/

+0

Действительно элегантное решение, но не отвечающее на мой вопрос. Спасибо за предложение, я попробую. –

+5

Я предпочитаю более новую альтернативу [tmux] (https://tmux.github.io/). –

+0

http://bphogan.com/2012/06/15/tmux/ –

5

Еще одно возможное решение: mosh, что не совсем похоже на SSH, но поддерживает соединение с оболочкой, когда ваш компьютер переходит в спящий режим или даже после смены IP-адреса.

+3

Проблема с 'mosh' заключается в том, что для брандмауэра требуется открытие большого количества портов UDP. Это проблема для многих людей. – e40

+0

технически, можно 'sshuttle' UDP-трафик через сеанс ssh, а затем запустить' mosh' – danbst

2

Другим решением является использование autossh, которое в основном контролирует ваш сеанс ssh и восстанавливает соединение, как только оно прерывается (например, после цикла сна, но также, если вы потеряете соединение WiFi некоторое время, например). Это особенно хорошо работает для переадресованных портов/ssh-туннелей.

Описание: http://linuxaria.com/howto/permanent-ssh-tunnels-with-autossh.