解決策 1:
最も簡単な方法は、scp 経由でコピーすることです。さらに、この構文は他のいくつかの提案とは異なり、実際に機能します。
簡単にするために、この構文に勝るものはありません。潜在的に複雑なパイプを考慮する手間をかけずに、再帰的にコピー、rsync、または好きなものを実行できます。この構文は直感的に明確であり、あなたをフォローし、cat を無駄に使用しないシステム管理者がより簡単にサポートできます。
scp -3 devappserver:/path/to/copy/from qaappserver:/path/to/copy/to
scp man ページから:-3
2 つのリモート ホスト間のコピーは、ローカル ホストを介して転送されます。このオプションを使用しない場合、データは 2 つのリモート ホスト間で直接コピーされます。このオプションは進捗メーターを無効にすることに注意してください。
以下の例
- ワークステーションの名前は MacBook-Pro です。
- Dev Jump Box は devjumpserver という名前です
- 開発アプリケーション サーバーの名前は devapplicationserver
- .local という名前の LAN DNS ゾーンにあります
- QA ジャンプ ボックスの名前は qajumpserver
- QA Application Server の名前は qaapplicationserver
- .local という名前の LAN DNZ ゾーンにあります
- 670 GB の /etc/hosts ファイルのテスト コピーを実行します;-)
- SSH 公開鍵認証が設定されていることを前提としています。
これは ~/.ssh/config ファイルで、ワークステーションから適切なジャンプ (要塞サーバーとも呼ばれます) を介してアプリケーション サーバーへの直接アクセスを設定します。
MacBook-Pro:~ barrychapman$ cat ~/.ssh/config Host * ServerAliveInterval 60 Host devapplicationsever HostName devapplicationserver.local ProxyCommand ssh -i ~/.ssh/id_rsa [email protected] -W %h:%p User barrychapman Host qaapplicationserver HostName qaapplicationserver.local ProxyCommand ssh -i ~/.ssh/id_rsa [email protected] -W %h:%p User barrychapman MacBook-Pro:~ barrychapman$
ターゲット サーバー上のファイルの存在をテストしていますが、存在しません。
MacBook-Pro:~ barrychapman$ ssh qaapplicationserver ls /tmp/hosts ls: cannot access /tmp/hosts: No such file or directory Killed by signal 1. MacBook-Pro:~ barrychapman$
では、ワークステーションを介して Dev Application サーバーから QA Application にファイルをコピーしましょう。
MacBook-Pro:~ barrychapman$ scp -3 devapplicationserver:/etc/hosts qaapplicationserver:/tmp/ Killed by signal 1. Killed by signal 1. MacBook-Pro:~ barrychapman$
ここで、QA アプリケーション サーバーにコピーされたファイルが存在するかどうかを確認します。今回はそこにあります。
MacBook-Pro:~ barrychapman$ ssh qaapplicationserver ls /tmp/hosts /tmp/hosts Killed by signal 1. MacBook-Pro:~ barrychapman$
注意
ProxyCommand 接続を閉じると、「Killed by signal 1」という警告メッセージが表示されます。これは ProxyCommand 接続を切断する SSH であり、心配する必要はありません。 LogLevel Quiet
を追加することでそれを取り除くことができます 踏み台ホスト構成スタンザに追加します。
解決策 2:
パイプ!
インターネットが一連のチューブである場合、Unix は一連のパイプです -- 次のようなものです:
cat ginormous-file | ssh [email protected] "cat | ssh [email protected] \"cat >out\" "
動作するはずです。
より多くのホストをトラバースする必要がある場合は、パイプを追加します (および \
のネストされたレイヤーを追加します)。 -エスケープされた引用符) 必要に応じて。 (ただし、パイプライン/エスケープが非常に複雑になり、図を描くか、エスケープを2倍にする必要がある回数を決定するために指で数えることに頼る必要がある場合は、おそらく敗北を認めて適切なVPNをセットアップするときです. !)