私は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
ほぼすべてのことがすでに言われていますが、ここで私の最後の一文を紹介します: 私は nc
も soc
も使わずに ProxyCommand のバリアントを使っています。OpenSSH Proxies and Jumphost Cookbook に基づいて、私は以下のような設定を作りました
ということで、以下のような選手がいます
- HOME_HOST: ターゲットホストにファイルをコピーする場所です
- HOP_HOST: このホスト(HOP_USERとしてログに記録されている)を経由してコピーします
- TARGET_HOST: 目的地(TARGET_USERとして認証されている)です
まず、ホップホストとターゲットホストの両方で、ホームホストの
.ssh/id_dsa.pub
から.ssh/authorized_keys
に自分のローカル公開鍵を追加してみました。はい、ホームホストから両方に同じ公開鍵を追加しました。通常はHOPの公開鍵をTARGETの公開鍵に追加することになると思うのですが、今回はHOPの公開鍵をTARGETの公開鍵に追加しましたそこで、
.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 で動作します
もう一つの一般的なオプションとして、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