あるリモートサーバーから別のリモートサーバーへのscp


15

サーバーに1つの大きなファイルがoneあり、をtwo使用してサーバーにコピーしたいscp。キーを正しくセットアップし、デスクトップから両方のサーバーにssh / scpできます。

コピーする必要があるファイルは、ワークステーションのhddの空き容量よりも大きいため、次のようにしたかったです。

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

しかし、私は得た:

ssh: Could not resolve hostname one: Name or service not known

ここにはDNSがないので(理由は聞かないでください)、〜/ .ssh / configにこれがあります。

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

小さいファイルで試しoneて、ワークステーションからに転送すると、正常にtwo動作します。

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

コメントで提案されているようにIPアドレスを直接使用すると、次のようになりました。

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

問題ない:

ここではサイズは問題ではありませんbigfile.tar.gz。ワークステーションに保存する方法がなかったため、この問題の「トリガー」にすぎませんでした。問題は、ファイルサイズに関係なく発生します。

質問:

なぜコマンドは:

scp oneremote:file secondremote:file

.ssh/configエイリアスを使用するか、IPアドレスを直接使用するかに関係なく、エラーをスローしますか?

解決-並べ替え-まだ説明を探しています -私はビッグファイルを小さなファイルに分割し、ワークステーションを介して1つずつ転送しました。私はまだそれがなぜ機能しなかったのか疑問に思っています。だから、私はまだ何が間違っていたかのいくつかの説明をいただければ幸いです。

それが失敗する理由を見つけた:私は愚かだったようです。私はコマンドだと思っ

scp one:file two:file

各サーバーへの接続を2つ作成してから、1つからデータを受信し、すぐに2つに送信して、リレーのように動作していました。

シンプルなので、これは、明らかにそうではありません-vオプションは、それが実際にだけに接続することを明らかにした1から1それがに接続しようとする2。サーバー12に接続することを想定していないため、これは明らかに不可能です。


「scp jspurny @ ip_address_server_one:/opt/bigfile.tar.gz jspurny @ ip_address_server_two:/opt/bigfile.tar.gz」のようなIPアドレスを使用するようにscpコマンドを変更してみましたか。

@tchester:私は今やったが、それはただ別のエラーを与える(編集された質問を参照)
Jan Spurny


@slmいいえ、サイズに問題はありません。
Jan Spurny

エラーの説明を見つけたので、それを自分の答えとして追加/受け入れたいと思いましたが、実際には問題を解決しないため、少し不公平に思えます。ワークステーションをリレーとして使用して、サーバー1からサーバー2にファイルをコピーする方法について質問を言い換えるべきだと思いますか?または、-verboseオプションを回答として使用できないという説明を追加して受け入れますか?
Jan Spurny

回答:


6

シンプルパイプ

これを試して:

ssh one 'cat file' | ssh two 'cat > file'

1つ目はファイルの内容をマシンに送信し、2つ目はそれを2つ目のマシンに送信する必要があります。転送後に両端でチェックサムを計算し、途中で失われたり文字化けしたりしないようにします。

精巧なトンネル

より複雑なアプリケーションでは、sshトンネルを使用できます。たとえば、次のようなものを試すことができます。

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

その後one、マシンlocalhostポートへの接続を開くと、50012回転送され、ポートtwoへの接続として終了しlocalhostます22。これはsshポートであるため、これをさらに別のscp、またはrsyncなどに使用できます。また、rsyncサーバーtwoを22で起動し、22の代わりにポート873を転送することもできます。またはnc、任意のポート番号を使用して、両側で生データを転送することもできます。

上記のアプローチの主な利点は、一方向のパイプのみではなく、2つのマシン間に双方向のTCP接続があることです。このようにして、2つの当事者は情報を交換できます。これは、このrsync場合に特に重要です。


1
ありがとう!これは、私が望んでいたことを正確には行いませんが、実際に必要なことを行います。
ヤンSpurny

16

この回答の全クレジットは/superuser//a/602436/142948にあります

-3scp のオプションが必要です。

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3:2つのリモートホスト間のコピーは、ローカルホストを介して転送されます。このオプションを使用しない場合、データは2つのリモートホスト間で直接コピーされます。

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

そうでない場合、ホスト「one」で2番目のエイリアス「two」が解決されますが、これは存在しない可能性があります。


残念ながら、このオプションはかなり新しく、まだすべてのディストリビューションに広まっているようです。
whereswalden 14年

2

ソースサーバー(1つ)にユーザーアクセスできるので、ログインしてそのサーバーでscpコマンドを直接実行しないでください...時間がかかりすぎることが心配な場合は、でコマンドを起動screenCtrl+a d、実行させてください。

ただし、ワークステーションからこれを行う必要あり、送信元サーバーから宛先サーバーへのSSHキーが正常に機能している場合scpは、ssh次のようにコマンドのパラメーターとしてコマンドを送信します。

ssh user@source 'scp /path/to/file user@destination:/path/to/file'

おかげで、これらのサーバーの両方でPasswordAuthenticationが無効になり、キーを相互に追加できないことを除いて、それは間違いなく機能します。お互いに接続できないはずです。
Jan Spurny

0

エラーメッセージの検索:「ホストキーの検証に失敗しました。」ここで行うのが最も簡単なことのようです。askubuntuで、「ホストキーの検証に失敗しました…」というSSH接続の問題というタイトルのこのQ&Aを見つけました。

そのQ&A に対する回答の 1つは、~/.ssh/known_hostsファイル内の競合するエントリに問題があることを示唆しています。テキストエディタを使用して、そのファイルから問題のあるエントリを削除するか、このコマンドを使用してエントリを削除できます。

$ ssh-keygen -R hostname

どこhostnameから接続しようとしているサーバーのIPアドレスまたは名前になります。ところで、上記はすべてホスト2にあります。


理解できるかどうかわかりません。問題なくワークステーションからssh とサーバーにアクセスできます。ワークステーションから実行すると問題が始まります。そして、1つまたは2つのファイルはありません。私は自分のワークステーションで2つのキー(確かに1つでも)を削除しようとしましたが、何も変わりませんでした(y / n propt を確認てください)。onetwoscp one:file two:fileknown_hosts
ヤンSpurny

@JanSpurny-あなたのワークステーションについて言及することは、少なくとも私にとってはこのQで少し混乱している。あなたがあなたのラップトップ/デスクトップを意味すると言うとき。それで、あなたはそれが「動く」と言うとき、このようなことをしています:scp workstation:file one:fileそしてworkstation:file two:file?明らかに「workstation:file」と言う必要はありません。会話のために明示的に言っているだけです。
slm

私が言及しているのは、ワークステーションからすべてのコマンドを実行したということです。だから、もっと似ていた:workstation$ scp one:file fileworkstation$ scp file two:file。とにかく、私はそれを解決したと思います。それを自分の答えとして追加します。
ヤンSpurny

@JanSpurny-わかりました、わかりました。ところで、質問ありがとうございます!
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.