Представим ситуацию – есть сервер, соединение с которым должно быть всегда активным, даже если в 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 [ctrld@host][~] 17:14 [ctrld@host][~] Write failed: Broken pipe
Через какое-то время я получаю “Write failed: Broken pipe”. В данном случае переподключиться вручную просто, но всегда найдётся ситуация, когда это сделать гораздо труднее.
Но есть полезная терминальная программа
Устанавливаем 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 [ctrld@host][~] ... 20:39 [ctrld@host][~] logout
На идею использования autossh меня натолкнуло обсуждение на
Идея решения такова – в локальной сети должен быть хост dmz.host.com, имеющий возможность соединения по ssh с внешним репозиторием. Через этот хост строится туннель ssh:
internal.host.com$ autossh -M 20000 -f -N -L 2222:git.host.com:22 user@dmz.host.com
Затем на внутреннем хосте в ~/.ssh/config описывается, что нужно ходить на репозитории через туннель:
Host git.host.com HostName localhost Port 2222
Уточню – я пока этот рецепт не использую и работоспособность не протестировал. Однако всё выглядит очень правдоподобно.