web-dev-qa-db-ja.com

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

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

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

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

87
sverrejoh

あなたは付け加えられます -oの代わりにscpへのオプション.ssh/config

scp -o ProxyCommand="ssh $jump_Host nc $Host 22" $local_path $Host:$destination_path

$jump_Hostは、この場合の「サーバーB」です。

48
John Tantalo

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

Host distant
ProxyCommand ssh near nc distant 22

これにより、SSHは、nearと名付けられたマシンを介してプロキシすることにより、distantと名付けられたマシンに「直接」接続できるようになります。その後、scpやsftpなどのアプリケーションを使用して、離れたマシンにアクセスできます。

これが機能するためには、nearという名前のマシンにインストールされた「nc」またはnetcatが必要です。しかし、現代のシステムの多くはすでにそれを持っています。

towoのtarソリューションは、tarの構文と操作規則を覚えているとすれば、ワンショットの問題に対してより効果的です。

44
tialaramex

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

Host distant
    ProxyCommand ssh near -W distant:22

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

編集:BでOpenSSH 5.4以降が必要

19
danblack

あなたは次のようなものを使用してサーバー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の大文字と小文字を正しく使用することを忘れないでください

18

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

次のコマンドは、server2remotePathから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>
5
donhector

本当に邪魔になりたい場合は、tar c mydir | ssh server "ssh otherserver | tar x"のようなsshとtarをチェーンすることができますが、これはあらゆる問題に遭遇する可能性があります。

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

3
towo

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

ファイルの送信先のマシンでsshセッションが開かれているとします。この最も遠いホップのPCを、これをhop2と呼びます。 「プロキシ」ホストはhop1になります。ファイルオリジンのPCです。これをオリジンと呼びます。

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

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

On 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まで同じことができます。

ホップ1:

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、Originへとトンネリングされました。偶然にも、現在、ポート5555と6666の両方がOriginで開いており、hop2のポート22にリダイレクトされます。このセッション内では、次の両方がhop2への有効なscpルートです。

On Origin:

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

このようにして、中間に任意の数のホップを置くことができ、2つ以上のホップをチェーンするという点で作業しやすくなります。

2
SYANiDE

複数のホストで使用できる設定の次の例openssh configを適用してみてください。

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

これは、ジャンプボックス/ゲートウェイサーバー「bastion-uat」を介してのみアクセス可能な「uat-」で始まるサーバーのセットを想定しています。ログインにキーを使用している場合は、ForwardAgent yesも追加する必要があります。

1

これはscp(OPが要求したもの)ではありませんが、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を使用すると、日付の比較、フォルダーの同期などのオプションがあります。これが誰かに役立つことを願っています!

1
texas-bronius