web-dev-qa-db-ja.com

.shスクリプトを作成して、SSH接続が存在するかどうかを確認し、存在しない場合は接続します

私は、簡単なスクリプトだと思うものを書くのに苦労しています。

基本的に私は職場にコンピューターを持っています。コンピューターはアクセスできないNATの後ろに隠れています。このコンピューターにSSHで接続する必要があるので、これを行う唯一の方法は、このNATされたコンピューターが自宅のサーバーに接続する逆ポートリダイレクトを設定することです。ホームサーバー経由で。

.shスクリプトは、職場のコンピューターによって5分ごとに実行されます。これは私がやりたいことです。

進行中のサーバーへのアクティブなssh接続があるかどうかを確認し、ある場合は、何もせずにスクリプトを終了します。

アクティブな接続が検出されない場合は、「ssh [email protected] -i key.priv」を実行して接続し、スクリプトを終了します。

Ssh接続の試行が何らかの理由で(たとえば2分以上)ハングした場合は、スクリプトを強制終了します(これが可能かどうかわからない場合は、そこにいる必要はありません)

アドバイスありがとうございます。

3
Askerman

次のコマンドを使用してSSH接続を確立すると仮定します(sshコマンドを簡略化する.ssh/configファイルを使用することをお勧めしますが、これは必須ではありません)。

ssh user@Host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa
  • オプション-fTNは、接続をバッ​​クグラウンドにプッシュします-この一連のオプションは、以下の提案で重要であるため、この主要部分を書きました。
  • オプション-R 2222:127.0.0.1:22は、逆トンネルを作成します。
  • オプション-i $HOME/.ssh/id_rsaはIDファイルを示します。

ps -aux | grep "<our command>" | sed '$ d'を使用して、接続が確立されているかどうかを確認できます。これに基づいて、スクリプトは次のようになります。

#!/bin/bash
SSH_COMMAND="ssh user@Host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then exec $SSH_COMMAND
fi

このスクリプトをmy_autosshと呼び、~/binに配置して実行可能にします。次にcrontab -eを実行し、次のジョブを追加します。

* * * * * $HOME/bin/my_autossh

Cronを使用したくない場合は、次のようにscrip my_autosshを変更します。

#!/bin/bash
SSH_COMMAND="ssh user@Host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"

while true; do
    if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
    then eval $SSH_COMMAND
    else sleep 60
    fi
done

そして、Nohupを使用して、バックグラウンドにプッシュします。

Nohup my_autossh >/dev/null 2>&1 &

また読む:

3
pa4080