web-dev-qa-db-ja.com

同じネットワーク内にない2つのサーバー間のscp

2つの異なるVPN接続でアクセスできる2つのサーバーがあります。私は自分のマシンで両方のVPNを同時に動作させることができました(少しのルーティングルール)。

やりたいscp <remote1>:some/file <remote2>:destination/folder私のラップトップ端末から。しかし、これを試してみると、remote1で呼び出されたscpコマンドは、同じネットワーク内にないため、remote2を見つけることができません。 scpコマンドを強制的に私のラップトップをルーターとして通過させることは可能ですか?

Nautilus(サーバーに接続し、両方のサーバーに接続してからコピーアンドペースト)を試してみれば機能しますが、ターミナルから実行したいと思います。

13
Danduk82

Scpの新しいバージョンには、オプション-3があります。

-3

Copies between two remote hosts are transferred through the local Host. Without this option the data is copied directly between the two remote hosts
34
Andy

scp -3よりも柔軟性が必要な場合は、単純なsshとパイプが楽しいです。

これは、ローカルマシンを介してストリームをリダイレクトするのと同じです。

ssh sourceRemote 'cat /path/to/sourceFile' \
| ssh destinationRemote 'cat > /path/to/destinationFile'

その後、任意の時点でストリームリダイレクトを追加できます。複数の中間マシンをチェーンするか、転送されるファイルのルーティング時にローカルコピーを保存します。

9
Anko

@Ankoの答えを拡張すると、複数のファイルに対してtarを使用できます。

ssh -q user@sourcehost 'cd /source/path; tar -czf - files...' | \
ssh -q user@desthost 'cd /dest/path; tar -xzf -'

圧縮は完全にオプションです。データはあまり圧縮できないか、オーバーヘッドを保証するほど大きくない場合があります。 tarのバージョンが-zスイッチをサポートしていない場合は、それぞれgzip -cgzip -dcを介してパイプ処理します。

PS:抽出時に先頭のスラッシュを削除しないtarのバージョンに注意してください(つまり、指定されている場合は絶対パス名に書き込みます)。

編集:疑似端末が割り当てられていないため、-e noneはパイプでは必要ありません。

6
arielCo