2011-07-20 14 views
6

私はLinuxの初心者ですが、sshとトンネルではかなり初心者です。バックグラウンドsshトンネルの自動(再)スタートを設定するには

とにかく、私の目標は、バックグラウンドで開いているsshトンネルを維持することです。

はそのために、私はその後、(バッチが自動的に平日の間、5分ごとに処理され、午前8時から午後9時までされた)のcrontabに追加次のバッチを書きました。 stackoverflowの他のスレッドで、autosshを使用して、sshが再帰チェックで常にokになるようにしてください。だから私は....

#!/bin/bash 
LOGFILE="/root/Tunnel/logBatchRestart.log" 
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date & time of log 

if ! ps ax | grep ssh | grep tunnelToto &> /dev/null 
then 
    echo "[$NOW] ssh tunnel not running : restarting it" >> $LOGFILE 
    autossh -f -N -L pppp:tunnelToto:nnnnn [email protected] -p qqqq 
    if ! ps ax | grep ssh | grep toto &> /dev/null 
    then 
      echo "[$NOW] failed starting tunnel" >> $LOGFILE 
    else 
      echo "[$NOW] restart successfull" >> $LOGFILE 
    fi 
fi 

私の問題は、すべてのものはOKに見えますが、時々トンネルは、作業を停止することですやった(psの斧は|はgrepのsshは>結果は、2つの期待されるタスクを示していますautossh主なタスクとsshトンネル自体)。私は実際に、トンネルがもう応答しなくなるとすぐにエラーを引き起こす第三者のソフトウェアによってトンネルが使用されるという問題について知っています。

ので、私はトンネルをチェックし、死んだことを起こる場合は、それを再起動することができますために、私のバッチを改善する方法を疑問に思って。私はthereでいくつかのアイデアを見ましたが、私がすでに使っている "autossh"ヒントによって結論付けられました。したがって、私はアイデアがありません...あなたのいずれかがいる場合は、私は喜んでそれらを見ているだろう!

ご質問ありがとうございました。ありがとうございました。

+0

私はあなたがserverfault.comを見ているべきだと思います。 'ssh'または' autossh'を検索してください。例:http://serverfault.com/questions/159766/bash-script-with-permanent-ssh-connection – powerMicha

答えて

12

代わりpssshプロセスをチェックするのは、次のと実際にcrontab -e

#!/bin/sh 

REMOTEUSER=username 
REMOTEHOST=remotehost 

SSH_REMOTEPORT=22 
SSH_LOCALPORT=10022 

TUNNEL_REMOTEPORT=8080 
TUNNEL_LOCALPORT=8080 

createTunnel() { 
    /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:TUNNEL_REMOTEPORT [email protected]$REMOTEHOST 
    if [[ $? -eq 0 ]]; then 
     echo Tunnel to $REMOTEHOST created successfully 
    else 
     echo An error occurred creating a tunnel to $REMOTEHOST RC was $? 
    fi 
} 

## Run the 'ls' command remotely. If it returns non-zero, then create a new connection 
/usr/bin/ssh -p $SSH_LOCALPORT [email protected] ls >/dev/null 2>&1 
if [[ $? -ne 0 ]]; then 
    echo Creating new tunnel connection 
    createTunnel 
fi 

、このスクリプトは意志を経由して、あなたのcrontabに追加を行います

は、スクリプトを作成するには、次のトリックを、行うことができます2つのポートを開く

  • ポート22は、トンネルがまだ生きているかを確認するために使用されます
  • あなたは

を使用する場合がありますポートである

  • ポート8080それ国連Aのための十分なスペースがないので、(私は答えとしてこれを追加チェックして、私のコメント

  • +0

    こんにちは、ありがとう。 – Marvin

    +0

    こんにちはマーヴィン、私の答えがあなたの問題を解決するのに役立ちましたら、それに投票し、この答えを受け入れる - これはあなたと私の評判をstackoverflowで上げるでしょう。 – powerMicha

    +0

    私は試しましたが、いくつかの問題が発生しました: *私はポートについて混乱しています。リモートポートが同じであるべきではありません。 *また、ポートについて:私はこのオプションを '-p $ SOME_PORT'と使用していました。これは$ REMOTE_PORTをオーバーライドするのでしょうか、これはいくつかの追加ポートですが、それを意図的に言及しないようにしましたか? 最終的に、(固定)バッチから返されます。 ssh:ホスト名[MyHostName]を解決できませんでした:名前またはサービスが不明です。ホスト名は正しいが、ポート22でトンネルリスナーを実行できなかったように見える):stgが見つかりませんか? – Marvin

    0

    を経由して、さらに質問を送ってくださいコメント)

    [OK]を、私は(私はそれがトリガーされる可能性がために、localhostの代わりに私のホスト名を指定する必要がありました)SSHトンネルを起動するバッチ実行を行うために管理:

    #!/bin/bash 
    
    LOGFILE="/root/Tunnel/logBatchRedemarrage.log" 
    NOW="$(date +%d/%m/%Y' - '%H:%M)" # date et heure du log 
    
    
    REMOTEUSER=username 
    REMOTEHOST=remoteHost 
    
    SSH_REMOTEPORT=22 
    SSH_LOCALPORT=10022 
    
    TUNNEL_REMOTEPORT=12081 
    TUNNEL_SPECIFIC_REMOTE_PORT=22223 
    TUNNEL_LOCALPORT=8082 
    
    createTunnel() { 
        /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:$SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:$TUNNEL_REMOTEPORT [email protected] -p $TUNNEL_SPECIFIC_REMOTE_PORT 
        if [[ $? -eq 0 ]]; then 
         echo [$NOW] Tunnel to $REMOTEHOST created successfully >> $LOGFILE 
        else 
         echo [$NOW] An error occurred creating a tunnel to $REMOTEHOST RC was $? >> $LOGFILE 
        fi 
        } 
    
    ## Run the 'ls' command remotely. If it returns non-zero, then create a new connection 
    /usr/bin/ssh -p $SSH_LOCALPORT [email protected] ls >/dev/null 2>&1 
    if [[ $? -ne 0 ]]; then 
        echo [$NOW] Creating new tunnel connection >> $LOGFILE 
        createTunnel 
    fi 
    

    しかし、トンネルが稼働しているときに、すぐにcronがバッチを再開しようとしたときに、私はすぐにメッセージを受け取りました。また、証拠を得るのに時間が必要なので、トンネルが外れてもまだ正常に再起動するとは言えません。

    ここでは、バッチの2番目の開始に対する応答を示します。

    バインド:すでに使用channel_setup_fwd_listenerにおける住所:10022バインド:すでに使用 channel_setup_fwd_listenerにおける住所:港へ を聞くことはできませんが、ポートを聞くことができません:8082ことができませんでし 要求ローカルフォワーディングを。

    +0

    あなたが取得したアドレスメッセージは、トンネルがすでに実行中であるかどうかをチェックする部分をスクリプトから削除したためです。 'pgrep -fl $ SSH_LOCALPORT:$ REMOTEHOST:$ SSH_REMOTEPORT'は、最初の実行からのsshがまだ実行中であることを示します。 – Superole

    -1

    あなたは接続をテストし、必要に応じて開くためのnetcatを使用することができます。

    while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 [email protected]; done 
    
    関連する問題