sshのポートフォワーディングを維持するシェルスクリプト

sshのポートフォワーディングを毎回コマンド打って起動するのが面倒なので,接続を維持するためのシェルスクリプトを書いた.

#! /bin/sh

while true; do
    # ここにフォワーディングのコマンドを書く
    ssh -C -N -L 50143:localhost:143 hostname

    sleep 1
done

といっても,たいしたことなくて,無限ループの中でプロセスを起動してるだけ.プロセスがなんらかの理由で終了したらループが回って起動しなおす.

このままだと,ネットワークがないとsshが失敗しまくって無駄が多いので,一定試行回数を超えたらしばらくおとなしくなるようにする.

#! /bin/sh

TRYCOUNT=0
TRYMAX=5

while true; do
    # ここにフォワーディングのコマンドを書く
    ssh -C -N -L 50143:localhost:143 hostname

    TRYCOUNT=`expr $TRYCOUNT + 1`
    sleep 1

    # TRYMAX回,接続を試みる
    if [ "$TRYCOUNT" -ge "$TRYMAX" ]; then
        TRYCOUNT=0
        sleep 600 # ネットワークが回復まで10分くらい待ってみる
    fi
done

これを,とりあえず,forwarding.shという名前で保存して,

$ forwarding.sh &

とかで動かしてみている.

特定のプログラムを起動しつづけるって,良くある処理だと思うんだけど,もっと良い方法があればぜひ教えて欲しいところです.

追記

autosshというコマンドをmrmtさんに教えてもらった!mrmt++

$ autossh -f -M 50000 -C -N -L 50143:localhost:143 hostname

とかやると,うえのスクリプトと同じようにssh接続を維持してくれるようです.コマンドいっぱつでできたのね.これは便利.-Mで指定しているポートはsshがちゃんと繋がっているかをautosshが確認するために使っているようです.なので,適当なポートを指定すればOK.