web-dev-qa-db-ja.com

中間ホスト経由のscpファイル

私はA、B、Cの3台のマシンにアクセスできます。(ssh)接続は以下の1つだけです。

A -> B
B <-> C

AからCへファイルを取得する必要があるので、AからBへファイルをscpして、次にBからCへそれらをscpすることができます。 Bを介してAからCへファイルをscpする方法はありますか?注意、私はどのマシンにもrootアクセス権がないので、永続的なトンネルを設定できるとは思わないでください。

74
astrofrog

ProxyJump

OpenSSH 7.3の新機能:

A$ scp -oProxyJump=B thefile C:destination

(舞台裏では、これはProxyCommandとssh -Wを使うだけです。)

ProxyCommand

他の回答からの-Wを含むように更新しました。

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

Aに非常に古いSSHクライアントがインストールされている場合(-Wサポートなし)、またはBがTCP転送を許可しないように設定されている(ただしシェルコマンドを許可する)場合は、代替方法を使用します。

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

パイプ

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

1ファイルだけの場合:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

Bを通る「トンネル」

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

完了したら、以前に開始したsshプロセス(これは-f -Nのためにバックグラウンドに落ちました)を終了することを忘れないでください。

  • -fコマンドの実行直前にsshにバックグラウンドに戻るよう要求します。これはsshがパスワードやパスフレーズを尋ねようとしているがユーザーがバックグラウンドでそれを望んでいる場合に便利です。これは-nを意味します。
  • -Nリモートコマンドを実行しません。これは単にポートを転送するのに便利です。

BからAへの「トンネル」を逆にする

いつもうまくいくとは限りません。

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -Rリモート(サーバー)ホスト上の指定されたTCPポートまたはUnixソケットへの接続が、ローカル側の指定されたホストおよびポート、またはUnixソケットに転送されることを指定します。
96
grawity

2011年初頭以降のバージョンの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.  Note that this option disables the
         progress meter.

あなたがこれを持っているならば、あなたはただ走ることができます:

B$ scp -3 A:file C:file
23
Dan Bloch

ほぼすべてがすでに言われていますが、ここに私の最後のペニーがあります:私はncsocもなしでProxyCommandの変種を使います。 OpenSSHプロキシとJumphost Cookbookに基づいて、私は以下の設定を作りました。

  1. だから我々は次の選手がいます:

    • HOME_Host:ファイルをコピー先のホストにコピーする場所からです
    • HOP_Host:このホストをコピーして(HOP_USERとして記録)
    • TARGET_Host:私たちの目的地です(TARGET_USERとして認証されています)
  2. 最初に私は私のホームホスト.ssh/id_dsa.pubからホップおよびターゲットホストの両方で.ssh/authorized_keysに私のローカル公開鍵を追加しました。はい、ホームホストから両方への同じ公開鍵です。通常、これはTARGET公開鍵に追加する必要があるHOP公開鍵です。

  3. それから私は以下のエントリを追加することによって.ssh/configを少し微調整しました:

    Host TARGET_Host
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_Host
    
  4. その後のコピー操作はscp FILE TARGET_Host:と同じくらい簡単です。ホップノードとターゲットノードの両方から二重バナーが表示されますが、機能します。

もちろん、ターゲットに直接sshするために上記のように使用することができます:ssh TARGET_Host。 scpとsshで動作します。

もう1つのより一般的なオプションは、一種の透過プロキシ(ssh上のvpn)のように見える sshuttle ユーティリティです。それであなたのA-> B <-> Cの場合それはCのネットワークの各ノードに接続することを可能にします:A-> B- [CDEFG]。管理者は必要ありませんが、Python 2.7(3.5もOK)が必要です。それを試す価値があります。

8
SQ9MCP
ssh -L 4321:hostC:22 youruser@hostB

別のシェルでは:

scp -P 4321 localfile [email protected]

これはポート転送を使用しています。ここでの唯一の制限は、ポートBを許可するようにホストBを設定する必要があることです。そうでなければこれはうまくいくはずです。

説明のために、-L-Rを使ってポートを転送することができます。 -Lでは、最初に指定されたポートは、sshが発信元のマシン(ホストA)でリッスンし始め、SSH接続を介してそのポートで受信したものをすべてホストBに転送し、ポート22でホストCにルーティングします。 。

編集

私は構文を少しめちゃくちゃにしました。それはあなたのLOCALマシンに前進を設定します。

7

GrawityのProxyCommandの答えは私のために働きましたが、私はSSHにあまり馴染みがないので、それはいくらか実験を要しました。私はGrawityの答えをもっと詳しく書いて私のように他のSSHへの初心者を手助けしたいと思った。より明示的な表記法の定義は次のとおりです。

マシンA:あなたがいるマシン

サーバーB:[email protected](ジャンプホストまたは中間サーバー)

サーバーC:[email protected](コピー先のリモートサーバー)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" thefile [email protected]:destination

具体例

具体的な例として、barという名前のユーザーアカウントを持つIP 0.0.1.2を持つサーバーにアクセスできるとします(サーバーC)。しかしそれを取得するには、まずfooという名前のユーザーアカウントでIP 0.0.1.1を使ってサーバーにログインする必要があります(サーバーB)。現在のマシン(マシンA)にあるファイルbaz.txtをサーバー0.0.1.2/home/bar/ディレクトリにコピーします。この例で上記のProxyCommandを使用するには、次のように実行します。

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" baz.txt [email protected]:/home/bar/

ファイルの順序とコピー先を切り替えることで、サーバーCからファイルを簡単にコピーすることもできます。例えば、もしbaz.txt0.0.1.2にあるサーバー/home/bar/上に既に存在していたら、あなたはそれをあなたのマシンにコピーすることができます:

    A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/home/bar/baz.txt /destination/path/on/A

これが、必要なものが他のものよりも少し詳しく説明できることを願っています。

1
Joseph Carmack