web-dev-qa-db-ja.com

2番目のリモートホストでscpする方法

Remote1ホストを経由して、ローカルマシンから直接remote2ホストからファイルをSCPする方法はないのでしょうか。

ネットワークは、remote1ホストからremote2ホストへの接続のみを許可します。また、remote1ホストもremote2ホストもローカルマシンにscpできません。

次のようなものがありますか?

scp user1@remote1:user2@remote2:file .

最初のウィンドウ:ssh remote1、次にscp remot2:file .

2番目のシェル:scp remote1:file .

最初のウィンドウ:rm file; logout

これらのすべての手順を実行するスクリプトを作成できますが、直接的な方法がある場合は、それを使用します。

ありがとう。

編集: SSHトンネルを開くようなことを考えていますが、どこに価値を置くべきか混乱しています。

現時点では、remote1にアクセスするには、ローカルマシンの$HOME/.ssh/configに次のものがあります。

Host remote1
   User     user1
   Hostname localhost
   Port     45678

remote1にアクセスしてremote2にアクセスするには、標準のローカルDNSとポート22を使用します。remote1に何を置くか、localhostに変更する必要がありますか?

71
Danosaure

単一のコマンドでファイルを直接コピーする方法はわかりませんが、ポート転送トンネルを開いたままにするためにバックグラウンドでSSHインスタンスを実行することを認める場合、1つのコマンドでファイルをコピーできます。

このような:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

最初のscpインスタンスがuser2@localhostへの転送接続をリッスンしているのはlocalhostのポート1234上にあるため、実際のsshコマンドではremote2として接続することに注意してください。 。また、後続のすべてのファイルコピーに対して最初のコマンドを実行する必要がないことに注意してください。単に実行したままにすることができます。

88
Dolda2000

ダブルssh

複雑な場合でも、sshを使用して、単一のコマンドラインを使用してファイル転送を処理できます;-)
そして、これはremote1localhostに接続できません:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

ただし、ファイルのプロパティ(所有権、アクセス許可など)を失います。

ただし、tarはこれらのファイルプロパティを保持するための友達です。

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

圧縮してネットワーク帯域幅を削減することもできます。

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

また、tarを使用すると、基本的なsshを介して再帰ディレクトリを転送できます。

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

ファイルが巨大で、他の重要なネットワークアプリケーションを妨害したくない場合は、scpによって提供されるネットワークスループット制限を見逃す可能性があります。 rsyncツール(例scp -l 1024 user@remote:fileは1メガビット/秒以上を使用しません。

ただし、回避策は ionice を使用して単一のコマンドラインを保持することです。

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

注:ioniceは、古いディストリビューションでは使用できない場合があります。

65
olibre

これはトリックを行います:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' user@remote2:path/to/file .

ホストremote2から直接ファイルをSCPするには、2つのオプション(HostおよびProxyCommand)を〜/ .ssh/configファイルに追加します( this スーパーユーザーの回答)。その後、次を実行できます。

scp user@remote2:path/to/file .

remote1について考える必要なく、ローカルマシンから。

29
John Manak

Opensshバージョン7.以降は簡単です。構成ファイルでProxyJumpオプションを使用します。

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion Host  

ログインまたはコピーするために実行するコマンド

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion Host copy.** 

もちろん、設定ファイルで設定されていない場合、sshコマンドにオプション "-J"を使用して要塞ジャンプホストを指定できます。

scpnotをサポートしているため、現在のところ「-J」フラグをサポートしているようです。 (私はマニュアルページで見つけることができませんでした。しかし、上記のscpは設定ファイルの設定で動作します)

5
user3851404

この構成は、私にとってはうまく機能します。

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

次に、コマンド

scp myfile production:~

myfile to production machineにコピーします。

0
anydoby