マルチホップSCP転送を行うにはどうすればよいですか?


85

マシンAからサーバーCにファイルをコピーしたいのですが、サーバーBを介してのみサーバーCにアクセスできます。

最初にサーバーBに転送し、ログインしてからサーバーCに転送する代わりに、SCPまたは同様のプログラムでファイルを直接転送することはできますか?

(Emacs tramp-modeには、ファイルをリモートで編集するためのこの機能があります)。

回答:


48

の代わりに-oオプションを追加できます。scp.ssh/config

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host この場合の「サーバーB」です。


これは私の好みの方法です。同じホストにゲートウェイから直接アクセスする場合、マルチホッピングのために.ssh / configを台無しにするのは最善の解決策ではありません。
ガブリエレ

これは、異なる/カスタムのユーザー名とポートでどのようになりますか?
パブロA

これを試して、パスワードを入力する必要があります。どうすれば修正できますか。ありがとう。
hqt

44

OpenSSHを想定して、.ssh / configでSSH構成に追加します

Host distant
ProxyCommand ssh near nc distant 22

これにより、SSHはnearという名前のマシンを介してプロキシすることにより、distantという名前のマシンに「直接」接続できるようになります。その後、遠方のマシンに対してscpやsftpなどのアプリケーションを使用できます。

これが機能するためには、「nc」、つまりnetcatがnearというマシンにインストールされている必要があります。しかし、多くの最新のシステムにはすでに搭載されています。

towoのtarソリューションは、tarの構文と操作規則を覚えていると仮定すると、1回限りの問題に対してより効果的です。


これは...「遠い」この例では...私が使用するのと同じ方法であり、サーバCと「近い」の明確化のため、サーバーBになるだろう
ジェレミーBouse

最近のマシンの多くには「nc」がありません。通常はLinuxマシンでのみ利用可能であり、リクエストによってのみ利用可能です(標準インストールの一部ではありません)。
メイ

1
sshには-Wオプションがあり、「nc」なしで自動的にこれを行いますが、なぜscp -W
kubanczyk

3
私だけではない場合、これは明らかではありませんでした:ユーザー名on nearがユーザー名on と異なる場合distant、近いユーザーはに行きProxyCommand ssh nearuser@near...、遠いユーザーは別のUser distantuser行に入ります。
ムーマインド

ただ、sshのマルチ希望を入力し、私はラッキー感じてグーグルを押してください
chandank

19

(B)マシンの近くにあるサーバー上の最新バージョンのsshでは、netcatがなくても以下が機能します。

Host distant
    ProxyCommand ssh near -W distant:22

ただし、近くの(B)マシンでAllowTcpForwardingをyes(デフォルト)にする必要があります。

編集:BのOpenSSH 5.4+が必要です


魅力のように動作します:)
gongzhitaao

1
そして、少なくともOpenSSH 7.4p1の時点で、コンマで区切られた各user @ host:portをリストするだけの「ProxyJump」コマンドがあります。いいね!
hmijail

ProxyJumpは便利ですが、構成ファイルからUserとIdentityFileを取得しませんでした。ProxyCommand -Wはこれを行い、scpでも動作します。
-rickfoosusa

18

あなたは次のようなものを使用してサーバーBにsshすることができます

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

その後、次を使用してサーバーCにsshできます

ssh -p 5022 <user_serverC>@localhost 

同様にscpは以下を使用して動作します

scp -P 5022 foo.txt <user_serverc>@localhost:

scpとsshでpの大文字と小文字を正しく使用することを忘れないでください


5

認証に証明書を使用する必要がある場合でも(AWS環境で一般的)可能であり、比較的簡単です。

以下のコマンドは、ファイルをremotePathon からserver2直接あなたのマシンにコピーしますlocalPath。内部的には、scpリクエストはを介してプロキシされserver1ます。

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

他の方法も機能します(アップロードファイル):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

代わりにパスワード認証を使用する場合は、で試してください

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

両方のサーバーで同じユーザー資格情報を使用する場合:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3

本当に邪悪になりたければ、のようなsshとtarを連鎖さtar c mydir | ssh server "ssh otherserver | tar x"せることができますが、これはすべての問題に直面する可能性があります。

より簡単な方法は、SSHの組み込みメソッドを使用してSSHトンネルをセットアップすることです。-Dマンページのスイッチを見て、他のサーバーのsshポートにポートを転送するだけです。


2

これを逆に行うこともでき、おそらくもっと簡単です。

ファイルの送信先のマシンでsshセッションが開かれていると仮定します。この最遠ホップのPC、これをhop2と呼びます。「プロキシ」ホストはhop1です。ファイルを起源とするPCを、その起源と呼びます。

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

トンネルを構築して、リモートPCでローカルポートを使用可能にすることができます。これにより、リモートPCで開くポートを定義します。これは、トンネルを構築したときに引き渡したポートへのリダイレクトになります。

hop2で:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

これで開かれたトンネルセッションで、hop1からfile_originまで同じことができます。

hop1で:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

これで、hop2からhop1を起点にトンネルされます。偶然にも、今ではポート5555と6666の両方がオリジンで開いており、hop2のポート22にリダイレクトされています。このセッションでは、次の両方がhop2への有効なscpルートです。

起源:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

この方法では、間に任意の数のホップを入れることができ、3つ以上のホップを連結するという点で作業が簡単になります。


1

複数のホストに使用できるセットアップの次のサンプルopenssh構成を採用してみてください。

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

これは、jumpbox / gatewayサーバー「bastion-uat」を介してのみアクセス可能な「uat-」で始まるサーバーのセットを前提としています。ForwardAgent yesログインにキーを使用している場合は、おそらく追加することもできます。


ForwardAgent yesこれには使用しないでください。要塞ではsshクライアントが実行されないため、この場合、エージェント転送は必要ありません。また、エージェントが不要なときに転送すると、セキュリティが低下するだけです。そして、私sshはあなたの命令に欠けていると思います。ssh必要のない最新バージョンが使用されている場合はncssh -W %h:%p bastion-uat代わりに入力できます。
カスペルド14年

@kasperd sshを含むように編集。ForwardAgentについて; ncコマンド自体を実行するために、sshクライアントが実行されます。おそらくあなたはシェルに言及していますか?
ベンジャミンGoodacre 14年

1

これは(OPが要求した)scpではありませんがrsync、次のように単一のホップを介してローカルからリモートにコピーするのに使用するのが非常に簡単であることがわかりました。

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

ソース:http : //mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

上記の-o ProxyPassの提案を試しましたが、私のニーズの変化に合わせて構成を変更したくありませんでした。上記リンクの作成者が述べているように、コロン(:)の前の宛先ファイルは、指定されたパスが宛先サーバー上にあることを示すために重要です。また、rsyncを使用すると、日付比較、フォルダー同期などのオプションがあります。これが誰かの助けになることを願っています。


-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost:/ tmp /。


3
ここに説明のつかないコードを少しだけ捨てないでください。この質問には多くの良い答えがありますが、既存のものに価値を追加する必要があります-これはありません。
スヴェン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.