Iedereen kent het wel: je zet een SOCKS-proxy op met ssh om te surfen, en plots blijkt het surfen niet meer te lukken. De oorzaak? Je ssh-verbinding is afgebroken door de slechte kwaliteit van je netwerk en je moet de verbinding opnieuw opzetten.

Kan dit niet automatisch? Inderdaad, en dit wordt gedaan door het programma autossh. Dit programma start ssh, monitort de ssh-verbinding en start ssh opnieuw op als er geen verkeer meer door lijkt te gaan of als ssh afgebroken wordt.

Geen antwoord

Met de optie -M poort:echopoort geef je poortnummers op voor de boodschappen in twee richtingen die monitoren of er nog verkeer door ssh gaat. In recente versies van OpenSSH kan de ssh-client echter zichzelf dankzij de opties ServerAliveInterval en ServerAliveCountMax afbreken als hij merkt dat hij geen antwoord meer krijgt van de server. In dat geval kun je het monitoren in autossh uitschakelen met -M 0, want autossh herstart de ssh-verbinding sowieso als het ssh-proces afgebroken wordt. Wil je op deze manier met ssh inloggen op een server, dan gaat dat als volgt:

$ autossh -M 0 -o "ServerAliveInterval 45" -o "ServerAliveCountMax 2" [email protected]

De opties kun je uiteraard ook in je ~/.ssh/config zetten, zodat je ze niet telkens hoeft in te typen.

Als je inlogt met een wachtwoord, dan wordt dit wachtwoord uiteraard opnieuw gevraagd wanneer autossh de verbinding opnieuw opzet. Voor niet-interactieve toepassingen zoals het opzetten van een tunnel of SOCKS-proxy is het dan ook gebruikelijk dat je een sleutelpaar gebruikt om in te loggen, in combinatie met ssh-agent zodat je alleen de eerste keer een passphrase hoeft in te geven.

De optie -f laat autossh overigens op de achtergrond draaien. Het verschil met de optie -f van ssh: je kunt nu geen wachtwoord of passphrase ingeven, dus het inloggen kan niet interactief gebeuren.

Verbatim

Alle andere opties die je aan autossh doorgeeft, worden verbatim aan ssh doorgegeven. Een SOCKS-proxy opzetten gaat bijvoorbeeld als volgt:

$ autossh -M 0 "ServerAliveInterval 45" -o "ServerAliveCountMax 2" -NCD 8080 [email protected]

Autossh is ook in te zetten in combinatie met andere programma's die ssh gebruiken, bijvoorbeeld sshfs:

$ sshfs -o reconnect,compression=yes,transform_symlinks,ServerAliveInterval=45,ServerAliveCountMax=2,ssh_command='autossh -M 0' [email protected]: /mnt/example

Het enige wat je dus moet doen is autossh -M 0 aan de optie ssh_command toekennen en zorgen dat je de opties ServerAliveInterval en ServerAliveCountMax instelt.

Afsluiten

Wanneer wordt de ssh-verbinding nu wel afgesloten? Wanneer het ssh-proces normaal afsluit (bijvoorbeeld omdat je exit in je ssh-sessie ingetypt hebt), of wanneer autossh het signaal SIGTERM, SIGINT of SIGKILL ontvangt. In al deze gevallen is het afsluiten van ssh immers intentioneel.

Als het ssh-proces om een andere reden afsluit (bijvoorbeeld omdat het merkt dat het geen gegevens meer van de server krijgt), wordt het echter opnieuw opgestart. En als autossh het SIGUSR1-signaal ontvangt, wordt een draaiend ssh-proces ook afgebroken en opnieuw opgestart. Lees de man-pagina of de README voor meer uitleg.