私はA、B、Cの3台のマシンにアクセスできます。(ssh)接続は以下の1つだけです。
A -> B
B <-> C
AからCへファイルを取得する必要があるので、AからBへファイルをscpして、次にBからCへそれらをscpすることができます。 Bを介してAからCへファイルをscpする方法はありますか?注意、私はどのマシンにもrootアクセス権がないので、永続的なトンネルを設定できるとは思わないでください。
OpenSSH 7.3の新機能:
A$ scp -oProxyJump=B thefile C:destination
(舞台裏では、これはProxyCommandとssh -W
を使うだけです。)
他の回答からの-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
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
リモートコマンドを実行しません。これは単にポートを転送するのに便利です。いつもうまくいくとは限りません。
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ソケットに転送されることを指定します。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
ほぼすべてがすでに言われていますが、ここに私の最後のペニーがあります:私はnc
もsoc
もなしでProxyCommandの変種を使います。 OpenSSHプロキシとJumphost Cookbookに基づいて、私は以下の設定を作りました。
だから我々は次の選手がいます:
最初に私は私のホームホスト.ssh/id_dsa.pub
からホップおよびターゲットホストの両方で.ssh/authorized_keys
に私のローカル公開鍵を追加しました。はい、ホームホストから両方への同じ公開鍵です。通常、これはTARGET公開鍵に追加する必要があるHOP公開鍵です。
それから私は以下のエントリを追加することによって.ssh/config
を少し微調整しました:
Host TARGET_Host
User TARGET_USER
ProxyCommand ssh -W %h:%p HOP_USER@HOP_Host
その後のコピー操作は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)が必要です。それを試す価値があります。
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マシンに前進を設定します。
GrawityのProxyCommandの答えは私のために働きましたが、私はSSHにあまり馴染みがないので、それはいくらか実験を要しました。私はGrawityの答えをもっと詳しく書いて私のように他のSSHへの初心者を手助けしたいと思った。より明示的な表記法の定義は次のとおりです。
マシンA:あなたがいるマシン
サーバーB:[email protected](ジャンプホストまたは中間サーバー)
サーバーC:[email protected](コピー先のリモートサーバー)
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.txt
が0.0.1.2
にあるサーバー/home/bar/
上に既に存在していたら、あなたはそれをあなたのマシンにコピーすることができます:
A$ scp -oProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/home/bar/baz.txt /destination/path/on/A
これが、必要なものが他のものよりも少し詳しく説明できることを願っています。