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

scp

私はA,B,Cの3台のマシンにアクセスしていますが、可能な(ssh)接続はこれだけです

A -> B
B <-> C

AからCへファイルを取得する必要があるので、AからBへファイルをscpして、BからCへファイルをscpする方法がありますが、Bはディスク容量が少ないので、これは選択肢にありません。AからBを経由してCにファイルをscpする方法はありますか?注:私はどのマシンにもrootアクセスを持っていないので、永続的なトンネルを設定できるとは思いませんが、間違っていたら訂正してください!私はどのマシンにもrootアクセスを持っていません

  103  astrofrog  2011-04-28


ベストアンサー

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

Pipes

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\""

たった一つのファイルのために

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ソケットに転送することを指定します

126  user1686  2011-04-28


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

33  Dan Bloch  2012-03-15


ほぼすべてのことがすでに言われていますが、ここで私の最後の一文を紹介します: 私は ncsoc も使わずに ProxyCommand のバリアントを使っています。OpenSSH Proxies and Jumphost Cookbook に基づいて、私は以下のような設定を作りました

  1. ということで、以下のような選手がいます

    • HOME_HOST: ターゲットホストにファイルをコピーする場所です
    • HOP_HOST: このホスト(HOP_USERとしてログに記録されている)を経由してコピーします
    • TARGET_HOST: 目的地(TARGET_USERとして認証されている)です
  2. まず、ホップホストとターゲットホストの両方で、ホームホストの.ssh/id_dsa.pubから.ssh/authorized_keysに自分のローカル公開鍵を追加してみました。はい、ホームホストから両方に同じ公開鍵を追加しました。通常はHOPの公開鍵をTARGETの公開鍵に追加することになると思うのですが、今回はHOPの公開鍵をTARGETの公開鍵に追加しました

  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 で動作します

もう一つの一般的なオプションとして、sshuttle ユーティリティがあるかもしれません。つまり、A->B<->Cの場合、Cのネットワーク上の各ノードに接続することができます。A->B-[CDEFG]に接続することができます。管理者は必要ありませんが、Python 2.7 (3.5でもOK)が必要です。試してみる価値はあります

9  SQ9MCP  2015-02-04


ssh -L 4321:hostC:22 youruser@hostB

を別のシェルに入れます

scp -P 4321 localfile youruser@127.0.0.1

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

説明の仕方としては、-L-R はポートを転送することができます。-L では、最初に与えられたポートは ssh が発信元のマシン (ホスト A) で待ち受けを開始するポートで、そのポートで受信したものはすべてホスト B に SSH 接続を介して転送され、ポート 22 でホスト C にルーティングされます

edit

構文を少し混乱させてしまいました。これはローカルマシンにフォワードを設定します

7  community wiki  2011-04-28


Grawity の ProxyCommand の答えは私にとってはうまくいったのですが、私は SSH にあまり慣れていないので、いくつかの実験が必要でした。私のような SSH の初心者のために、Grawity の答えをより詳細に綴ってみようと思いました。より明確な表記のための定義は以下の通りです

マシンA:あなたが乗っているマシン

サーバーB: userB@ip.address.for.B (ジャンプホストまたはミドルサーバー)

サーバーC: userC@ip.address.for.C (コピー先のリモートサーバー)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination

Concrete Example

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

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/

また、ファイルとコピー先の順番を入れ替えることで、サーバーCからファイルをコピーするのと同じように簡単にコピーすることができます。例えば、baz.txt がすでに 0.0.1.2 のサーバー上にあって /home/bar/ にある場合、次のようにして自分のマシンにコピーすることができます

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A

これは、物事が他の人よりも少しだけ彼らのために綴られたものを必要とする人々の助けになることを願っています

3  jmc1337  2019-06-17


v7.3 OpenSSH は <++1 をサポートしています。Aでは、ただ

tar cf - file1 file_n | ssh -J userB@B:Bport userB@C -p Cport 'tar -C destDir xvf -'
  • ssh の -J オプションを使用して、好きなだけホップを使用します
  • ホームフォルダにファイルを残すには、-Cを省略してください
  • 任意のファイルを一度に送信します(テキストまたはバイナリ)
  • 必要に応じて、tar の -z または ssh の -C でストリームを圧縮します

フローリアン・フィーダダン・ガースウェイトの回答にインスパイアされています

0  Pablo A  2020-09-18


タイトルとURLをコピーしました