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
に変更する必要がありますか?
単一のコマンドでファイルを直接コピーする方法はわかりませんが、ポート転送トンネルを開いたままにするためにバックグラウンドで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
として接続することに注意してください。 。また、後続のすべてのファイルコピーに対して最初のコマンドを実行する必要がないことに注意してください。単に実行したままにすることができます。
ssh
複雑な場合でも、ssh
を使用して、単一のコマンドラインを使用してファイル転送を処理できます;-)
そして、これはremote1
はlocalhost
に接続できません:
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
は、古いディストリビューションでは使用できない場合があります。
これはトリックを行います:
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
について考える必要なく、ローカルマシンから。
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"を使用して要塞ジャンプホストを指定できます。
注scpはnotをサポートしているため、現在のところ「-J」フラグをサポートしているようです。 (私はマニュアルページで見つけることができませんでした。しかし、上記のscpは設定ファイルの設定で動作します)
この構成は、私にとってはうまく機能します。
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にコピーします。