問題の2つの主要な環境があります。
開発とQA
各環境には2つのサーバーがあります。
アプリケーションサーバーに接続するには、まずジャンプボックスに接続してから、アプリケーションサーバーにSSHで接続する必要があります。
ファイアウォールの好意により、いくつかのルールがあります。
私たちの問題
DEVELOPMENT APPLICATION SERVER
には多くのコンテンツ(670 GB)があり、これをQA APPLICATION SERVER
に取得する必要があります。
このデータを必要なスペースが不足しているため、このデータをジャンプボックスにコピーすることはできません。
私はいくつかの調査を行い、これらのサーバーを介して一連のトンネルを実行できる可能性があることを知り、トンネルを介して1つのアプリサーバーから他のアプリサーバーにデータを直接ストリーミングできるようにしました。ただし、アプリケーションサーバーからジャンプボックスに接続できないという問題。
オプションはありますか?これは絶望的な状況になりつつあり、時間が最も重要です。データをダウンロードして再アップロードする時間はありません。サーバー上のネットワークを介したコピーは、ギガビット接続であるため、すばやく処理されます。
これまでのところ、最も簡単な方法は、scp経由でコピーすることです。さらに、この構文は実際には他のいくつかの提案とは異なり動作します。
簡単にこの構文を打ち負かすことはできません。複雑な可能性のあるパイプを考慮する手間をかけずに、再帰的にコピー、rsync、または必要な処理を行うことができます。この構文は直感的にわかりやすく、あなたをフォローしているシステム管理者がより簡単にサポートできるようになり、 役に立たないcatの使用 を行いません。
scp -3 devappserver:/path/to/copy/from qaappserver:/path/to/copy/to
From scp man page :-3
2つのリモートホスト間のコピーは、ローカルホストを介して転送されます。このオプションがない場合、データは2つのリモートホスト間で直接コピーされます。このオプションは、進行状況メーターを無効にすることに注意してください。
これは、適切なジャンプ(別名、要塞サーバー)を介してワークステーションからアプリケーションサーバーへの直接アクセスを設定する〜/ .ssh/configファイルです。
MacBook-Pro:〜barrychapman $cat〜/ .ssh/config Host * ServerAliveInterval 60 ホストdevapplicationsever ホスト名devapplicationserver.local ProxyCommand ssh -i〜/ .ssh/id_rsa [email protected] -W%h:%p ユーザーbarrychapman Host qaapplicationserver HostName qaapplicationserver.local ProxyCommand ssh -i〜/ .ssh/id_rsa [email protected] -W%h:%p ユーザーbarrychapman MacBook-Pro:〜barrychapman $
ターゲットサーバー上のファイルの存在をテストしますが、そこにはありません。
MacBook-Pro:〜barrychapman $ssh qaapplicationserver ls /tmp/hosts ls:/ tmp/hostsにアクセスできません:そのようなファイルまたはディレクトリはありません シグナル1によって強制終了されました。 MacBook-Pro:〜barrychapman $
次に、ワークステーションを介して、DevアプリケーションサーバーからQAアプリケーションにファイルをコピーします。
MacBook-Pro:〜barrychapman $scp -3 devapplicationserver:/ etc/hosts qaapplicationserver:/ tmp / シグナル1によって強制終了されました。 シグナル1によって強制終了されました。 MacBook-Pro:〜barrychapman $
次に、QAアプリケーションサーバーにコピーされたファイルが存在するかどうかを確認します。今回もあるでしょう。
MacBook-Pro:〜barrychapman $ssh qaapplicationserver ls /tmp/hosts /tmp/hosts シグナル1によって強制終了されました。 MacBook-Pro:〜barrychapman $
ProxyCommand接続を閉じると、「シグナル1によって強制終了されました」という警告メッセージが表示されます。これは、SSHがProxyCommand接続を切断することであり、心配する必要はありません。要塞Host configスタンザにLogLevel Quiet
を追加することで、それを取り除くことができます。
インターネットが 一連のチューブ の場合、Unixは一連のパイプ-次のようなものです。
cat ginormous-file | ssh user@Host1 "cat | ssh user@Host2 \"cat >out\" "
うまくいくはずです。
さらに多くのホストを走査する必要がある場合は、必要に応じてパイプ(および\
エスケープされた引用符のネストされたレイヤー)を追加します。 (ただし、パイプライン/エスケープが非常に複雑になり、ダイアグラムを描くか、指で数えることに頼らなければならない場合は注意してください エスケープで何倍にする必要があるかを決定するため おそらくそれは認める時です適切なVPNを無効にして設定してください!)
私が正しく理解していれば、2つのジャンプサーバー(jump-qaとjump-dev)があり、2つのアプリサーバー(app-qaとapp-dev)を保護しています。ジャンプサーバーは互いにsshできます。関連するジャンプサーバー以外のボックスは、対応するアプリサーバーにSSH接続できません。アプリサーバーは誰にでもsshできます。ファイルはapp-devからapp-qaに転送されます。両方のジャンプサーバーには、データの中間コピー用のスペースがありません。
これはsshトンネリングで解決できます。 1つのリモートアプリサーバーへの接続をセットアップし、そのジャンプサーバー上の未使用のポートに接続するリモートトンネルを伝送します。 1つのジャンプサーバーから別のジャンプサーバーへの2番目の接続を設定し、リモート転送されたポートのぶら下がり端をトンネル1からピックアップして、他のアプリサーバーのsshポートに送信するトンネルを伝送します。
トンネルを設定します(これらのコマンドはそれぞれjump-qa
の別のウィンドウで実行する必要があります):
jump-qa% ssh app-qa -R 2345:localhost:2346
jump-qa% ssh jump-dev -L 2346:app-dev:22
これで、app-qaでtelnet localhost 2345
を実行して、app-devのsshバナーを取得できることがわかります。次に、データファイルをコピーします。
app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat