中間マシンにデータのコピーを保持することに満足している場合は、server1を参照として使用してローカルコピーを更新し、次にローカルコピーを参照として使用してserver2のバックアップを更新するスクリプトを記述するだけです。
#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress
単純なスクリプトを使用するということは、すべてを実行するための単一のコマンドが必要であることを意味します。もちろん、これはデータが機密情報である場合(セキュリティ保護なし)になる可能性があります(あなたやあなたの会社の他の人は、あなたのラップトップにコピーを浮かばせたくないでしょう)。server1がローカルである場合は、後でローカルコピーを削除するだけでかまいません(次回、ローカルLAN経由で再構築するのが簡単になるため)。
サーバーがより効果的に相互に直接通信できるようにトンネルを構築することは、次のように可能であるはずです。
- サーバー2で、/ bin / shのコピーを/ usr / local / bin / shforkeepaliveとして作成します。コピーではなくシンボリックリンクを使用すると、セキュリティが/ bin / shにパッチを当てた後に更新する必要がありません。
サーバー2で、数秒間ループスリープしてから少量のテキストをエコー出力するだけのスクリプトを作成し、shの「コピー」を使用するようにします。
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
(echo
SSHdがsshクライアントからのキープアライブパケットを無視するように構成されている場合でも、セッションがタイムアウトになるまでアイドル状態にならないため、おそらく必要ありません)
これで、バックグラウンドでリバーストンネルを開始し、rsyncを使用してコピー操作を実行するようにserver1に指示し、ループスクリプト(SSHセッションを閉じる)を終了してリバーストンネルを終了するスクリプトをラップトップに書き込むことができます。
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ssh user@server2 killall shforkeepalive
これが機能する方法:
- 1行目:標準の「このスクリプトを解釈するために使用するコマンド」マーカー
- 2行目:リバーストンネルを使用してSSH接続を開始し、それを介してキープアライブスクリプトを実行して開いたままにします。末尾の&はbashにこれをバックグラウンドで実行するように指示し、次の行が完了するのを待たずに実行できるようにします
- 3行目:上記のトンネルに接続するトンネルを開始して、server1がserver2を認識できるようにし、rsyncを実行してこの配置でコピー/更新を実行します
- 4行目:rsync操作が完了すると(つまり、2番目のSSH呼び出しが戻ると)キープアライブスクリプトを強制終了します。これにより、最初のsshセッションが終了します。
これは特にきれいには感じられませんが、動作するはずです。私は上記をテストしていないので、調整する必要があるかもしれません。rsyncコマンドをserver1で1行のスクリプトにすることで、呼び出し側のsshコマンドで 'などの文字をエスケープする必要性を減らすことができます。
ところで、あなたは2つのサーバーがお互いを直接見ることができない理由を「尋ねないで」と言いますが、これにはしばしば正当な理由があります。私のホームサーバーとそのオンラインバックアップが保持されているサーバーは互いにログインできません(すべてのユーザーに対して異なるパスワードとキーを持っています)-これは、2つのうちの1つがハッキングされた場合、簡単なルートとして使用できないことを意味しますもう1つをハッキングして、私のオンラインバックアップをより安全にします(ライブから私のデータを悪意のある誰かが削除すると、メインのバックアップサイトに直接アクセスする機能がないため、バックアップを更新してそのバックアップを削除する機能を使用できません)。両方のサーバーはどちらも他の場所にある中間サーバーに接続できます-ライブサーバーは早朝にバックアップを(rsyncを介して)中間マシンにプッシュするように設定され、バックアップサーバーは(しばらくしてから手順1を完了するために)接続するように設定されています更新を収集します(繰り返しますが、rsycを使用し、その後、複数のバックアップ期間を維持するためにスナップショットを作成します)。このテクニックはあなたの状況でも使えるかもしれません。もしそうなら、私はよりクリーンな方法としてそれをお勧めします。
編集:私のハックをアーロンのものとマージして、/ bin / shのコピーとserver2の個別のキープアライブスクリプトによる面倒な作業をすべて回避します。ラップトップのこのスクリプトですべての作業を行うことができます。
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
上記と同様に、rsyncはlocalhost:2222に接続しています。これは、トンネルをラップトップのlocalhost:2222に転送し、ラップトップのlocalhost:2222は、他のトンネルを介してserver2のlocalhost:22に転送します。
編集2: server1がserver2で直接認証できるキーを持っていることを気にしない場合(トンネルなしではserver2を認識できない場合でも)、次のようにさらに単純化できます。
#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ここで、123.123.123.123はserver2のパブリックアドレスであり、スクリプトの代わりにコピーと貼り付けのワンライナーとして使用できます。