web-dev-qa-db-ja.com

スクリプトを使用してcrontabのリバースSSH接続を作成する

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で!

間違いを見つけられるように親切にしてください。私の問題に関して、このウェブサイトには多くの同様の質問があります。したがって、私は多くの答えを紹介しましたが、どれも役に立たないようです。

6
Denis

より良い解決策は、ウォッチドッグを利用することです。 watchdogは、実行中のプロセスを監視し、終了すると自動的に再起動するデーモンです。

Ubuntu 16.04にウォッチドッグをインストールする

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_script755権限を持ち、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を追加したので、トンネルを開始するだけでログインシェルの作成は試行しません。
  • -fautosshに追加して、バックグラウンドで実行されるようにしました。
  • サンプルスクリプトでは、単純なpgrepパターンを使用しています。ただし、特定のユーザーにテストをさらに絞り込むことも、プロセスにパターンを使用することもできます。 pgrepを使用してテストをさらにカスタマイズする方法については、 pgrep(1) を参照してください。

ウォッチドッグの構成

/etc/watchdog.conf/etc/defaults/watchdogは、ウォッチドッグを設定する場所です。 watchdog.conf(5) を参照してください。

注意すべきことの1つは、ユーザースクリプトがデフォルトで1秒ごとに実行されることです。よりリアルタイムのチェックが必要でない限り、これを少なくとも30秒に増やすことをお勧めします。 watchdog.confinterval設定を調整します。

トラブルシューティング

スクリプトの前に/etc/watchdog.dディレクトリを作成する必要がある場合があります。

/var/log/watchdog/*には、ウォッチドッグ関連のログとエラーが含まれます。スクリプトがstdoutまたはstderrに出力する場合、そこに書き込まれます。私のシステムでは、スクリプトがおよそ1秒に1回testまたはrepairを実行していることに気付きます。スクリプトでエコーを使用する場合は、デバッグ目的でのみ一時的に使用する必要があります。そうでない場合は、エラーの場合を除き、出力を破棄することをお勧めします。

スクリプトがまったく実行されていない場合は、許可を確認してください:ls -l /etc/watchdog.d

1
Sam Gleske