Представим ситуацию – есть сервер, соединение с которым должно быть всегда активным, даже если в shell нет никакой активности. Или же должен постоянно работать туннель ssh. Обычный ssh при разрыве соединения не производит его переустановку (разве что можно посылать alive-пакеты, но это действует для активных сессий: ssh -o ServerAliveInterval=10 host.com).

Вот, например, такую картину я вижу постоянно при соединении со своим сервером, когда сессия неактивна долгое время:

$ ssh host.com
Linux host.com 2.6.32.12-linode25 #1 SMP Wed Apr 28 19:25:11 UTC 2010 i686

20:51 [[email protected]][~]
17:14 [[email protected]][~] Write failed: Broken pipe

Через какое-то время я получаю “Write failed: Broken pipe”. В данном случае переподключиться вручную просто, но всегда найдётся ситуация, когда это сделать гораздо труднее.

Но есть полезная терминальная программа autossh. Она запускает ssh, производит мониторинг сессии и при необходимости её рестартует.

Устанавливаем autossh с помощью Homebrew:

$ brew update
$ brew install autossh

Ключи (если они необходимы) аналогичны ключам ssh, а особенности можно посмотреть в “man autossh”.

Теперь моя сессия с сервером держится до момента, когда я сам не выйду:

$ autossh host.com
Linux host.com 2.6.32.12-linode25 #1 SMP Wed Apr 28 19:25:11 UTC 2010 i686

10:03 [[email protected]][~]
...
20:39 [[email protected]][~] logout

На идею использования autossh меня натолкнуло обсуждение на StackOverflow по поводу организации доступа к внешним репозиториям git с хостов, которые не могут напрямую соединиться с ним по ssh.

Идея решения такова – в локальной сети должен быть хост dmz.host.com, имеющий возможность соединения по ssh с внешним репозиторием. Через этот хост строится туннель ssh:

internal.host.com$ autossh -M 20000 -f -N -L 2222:git.host.com:22 [email protected]

Затем на внутреннем хосте в ~/.ssh/config описывается, что нужно ходить на репозитории через туннель:

Host git.host.com
        HostName localhost
        Port 2222

Уточню – я пока этот рецепт не использую и работоспособность не протестировал. Однако всё выглядит очень правдоподобно.