web-dev-qa-db-ja.com

2つのステップでサーバーからファイルを取得する

次の状況があります。

  1. 私のマシン
  2. ゲートウェイマシン
  3. ターゲットマシン

#2と#3の両方にroot権限がありません。また、マシン#2に情報(200 MiB以下)を実際に保存することもできません(それがネットワークの残りの部分へのゲートウェイになることを目的としているため、それ以上ではありません)。マシン#3には、約3 GiBサイズのフォルダーがあります。これをローカルにコピーします。#1から#3にSSHで接続できませんが、#2にSSHで接続できます。 #2と#3の間に公開秘密鍵ペアを設定することもできませんが、#1と#2の間に鍵ペアがインストールされています。

通常、私はSSHとtarの組み合わせを使用してこれを実行します。

ssh name@Host "tar cf - folder" > folder.tar

しかし、この場合は、なんらかのネストが必要になるため、これを行うことができないようです。

それでは、データを#3から#1に取得するための良い方法は何でしょうか?

14
Cheiron

Machine2を介してSSHトンネルを作成し、別のセッションでトンネルに接続できます。

たとえば、machine1で2つのCLIセッションを開きます。最初のセッションで、次を実行します。

MACHINE1$ ssh -L 2022:MACHINE3:22 <user>@MACHINE2

2番目のセッションで、次を実行します。

MACHINE1 $ ssh -p 2022 <user>@localhost

最初のコマンドで起こっていることは、ローカルポート(machine1の2022)がmachine2へのSSH接続を使用してmachine3のポート22にトンネルされていることです。

2番目のコマンドでは、新しく開いたローカルポート(2022)に接続しており、machine3に直接接続しているようです。

通常のファイル転送プロセスを使用する場合は、次のようにします。

ssh -p 2022 <user>@localhost "tar cf - /path/to/remote/directory/" > filename.tar

または、rsyncに慣れ、代わりに次のようなことを行うことができます。

rsync -aHSv --progress -e 'ssh -p 2022' <user>@localhost:/path/to/remote/directory/ /path/to/local/directory/

最終目標はtarballを取得することではないと想定しています。

27
Gene

新しいバージョンのSSHのマスターセッション機能を使用することもできます。ここで説明されています:

https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing

おそらく、必要なのは.ssh/configを編集/作成することだけです。マスターセッションを制御する定義を追加します。

ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
ControlPersist 4h
ServerAliveInterval 30

次に、次のような最初のホップサーバー定義を指定できます。

Host first_hop
Hostname <your first Host FQDN or IP>
User <your user>

そして、2番目のホップは最初のホップサーバーをプロキシとして使用します。

Host second_hop
Hostname <your second Host FQDN or IP>
User <your user>
ProxyCommand ssh -W %h:%p first_hop

〜/ .ssh/cm_socketディレクトリを作成することを忘れないでください。設定権限は644にする必要があります。

次に、2番目のサーバーとの間で直接SSHまたはSCPを実行できます。このようにチェーンされたサーバーがさらに存在する可能性があります。

5
Jaroslav Kucera