私は、簡単なスクリプトだと思うものを書くのに苦労しています。
基本的に私は職場にコンピューターを持っています。コンピューターはアクセスできないNATの後ろに隠れています。このコンピューターにSSHで接続する必要があるので、これを行う唯一の方法は、このNATされたコンピューターが自宅のサーバーに接続する逆ポートリダイレクトを設定することです。ホームサーバー経由で。
.shスクリプトは、職場のコンピューターによって5分ごとに実行されます。これは私がやりたいことです。
進行中のサーバーへのアクティブなssh接続があるかどうかを確認し、ある場合は、何もせずにスクリプトを終了します。
アクティブな接続が検出されない場合は、「ssh [email protected] -i key.priv」を実行して接続し、スクリプトを終了します。
Ssh接続の試行が何らかの理由で(たとえば2分以上)ハングした場合は、スクリプトを強制終了します(これが可能かどうかわからない場合は、そこにいる必要はありません)
アドバイスありがとうございます。
次のコマンドを使用して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 &
また読む: