Digitalocean VPCへのリバースSSH接続を行うNATの背後にPCがあります。この逆SSH接続を自宅から利用して、オフィスのPCにログインし(そうする権限があります)、ファイルをコピーし、他の重要なことを行います。
頻繁ではありませんが、オフィスのPCが(停電などにより)再起動し、VPCとのリバースSSH接続が切断されることに気付きました。このような場合、自宅のPCからオフィスのPCに接続できません。
次のスクリプトを実行して、オフィスPCで生成されたトラフィック(閲覧情報を共有する必要がないため)を匿名接続する逆接続+動的プロキシを作成します。
autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
物理的にそこにいないため、再起動時にオフィスのPCでこのスクリプトを再度実行する方法はありません。この問題を解決するために、次のcrontabをインストールしました。
注:rev.sh
ファイルには上記の行が含まれています。証明書「digitalOcean」とrev.shはUbuntu home
にあります。したがって、Ubuntuターミナルで./rev.sh
を実行すると、動的プロキシを取得し、DigitalOceanサーバーにもアクセスします。この方法は100%機能します。
ただし、次の方法でcrontabをインストールすると、ubuntu PCは動的プロキシを作成しません。これは、Google Chromeからこのプロキシを確認すると、プロキシが接続を拒否していると表示されるためです。
ルートのcronジョブとして試したcronジョブは次のとおりです。私もこれらを通常のユーザーとして試しましたが、まだ動作しませんでした。
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
次に、現在時刻の数分前にcrontabをインストールし、実行するのを待ちました。
24 12 * * * bash /home/user/rev.sh
24 12 * * * /home/user/rev.sh
24 12 * * * reboot
これらも実行されませんでした。
48 15 * * * bash /home/user/rev.sh >> test3
と*/1 * * * * reboot -f >> test
も試しましたが、test3とtestには何もありません。ただし、ファイルは作成されました!! crontabで!
間違いを見つけられるように親切にしてください。私の問題に関して、このウェブサイトには多くの同様の質問があります。したがって、私は多くの答えを紹介しましたが、どれも役に立たないようです。
より良い解決策は、ウォッチドッグを利用することです。 watchdogは、実行中のプロセスを監視し、終了すると自動的に再起動するデーモンです。
Sudo apt-get install watchdog
watchdog(8)
デーモンは、引数test
またはrepair
で/etc/watchdog.d
のスクリプトを実行します。 (watchdog(8)
manページの TEST DIRECTORY
セクションを参照 )。ウォッチドッグスクリプトは、プロセスが実行されているかどうかを確認し、修復するアクションを実行するときに、これら2つの引数を処理します。
/etc/watchdog.conf
を変更してウォッチドッグを設定できます( watchdog.conf(5)
を参照)。
watchdog.d
スクリプトたとえば、/etc/watchdog.d/autossh_script
(755
権限を持ち、root
が所有します)を取り上げます。
注:スクリプト例では、
$targetuser
環境変数をカスタマイズする必要がある場合があります。sam
は私のユーザー名です。
#!/bin/bash
targetuser=sam
runTest=false
runRepair=false
case $1 in
test)
runTest=true
;;
repair)
runRepair=true
repairExitCode=$2
;;
*)
echo 'Error: script needs to be run by watchdog' 1>&2
exit 1
;;
esac
if ${runTest}; then
#run a test here which will tell the status of your process
#the exit code of this script will be the repairExitCode if it is non-zero
if ! pgrep autossh &> /dev/null; then
#autossh not running; notify watchdog to repair
exit 1
else
#autossh running; no action necessary
exit 0
fi
fi
if ${runRepair}; then
#take an action to repair the affected item
#use a case statement on $repairExitCode to handle different failure cases
su - ${targetuser} -c 'Nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
exit 0
fi
ssh
コマンドに-N
を追加したので、トンネルを開始するだけでログインシェルの作成は試行しません。-f
をautossh
に追加して、バックグラウンドで実行されるようにしました。pgrep
パターンを使用しています。ただし、特定のユーザーにテストをさらに絞り込むことも、プロセスにパターンを使用することもできます。 pgrepを使用してテストをさらにカスタマイズする方法については、 pgrep(1)
を参照してください。/etc/watchdog.conf
と/etc/defaults/watchdog
は、ウォッチドッグを設定する場所です。 watchdog.conf(5)
を参照してください。
注意すべきことの1つは、ユーザースクリプトがデフォルトで1秒ごとに実行されることです。よりリアルタイムのチェックが必要でない限り、これを少なくとも30秒に増やすことをお勧めします。 watchdog.conf
のinterval
設定を調整します。
スクリプトの前に/etc/watchdog.d
ディレクトリを作成する必要がある場合があります。
/var/log/watchdog/*
には、ウォッチドッグ関連のログとエラーが含まれます。スクリプトがstdoutまたはstderrに出力する場合、そこに書き込まれます。私のシステムでは、スクリプトがおよそ1秒に1回test
またはrepair
を実行していることに気付きます。スクリプトでエコーを使用する場合は、デバッグ目的でのみ一時的に使用する必要があります。そうでない場合は、エラーの場合を除き、出力を破棄することをお勧めします。
スクリプトがまったく実行されていない場合は、許可を確認してください:ls -l /etc/watchdog.d
。