Local.machine、proxy.machine、およびtarget.machineがあります。 local.machineはtarget.machineと直接接続していませんが、proxy.machineを経由する必要があります。
Target.machineからlocal.machineにファイルをscpしたい。これは、local.machineから1つのコマンドだけで実行できますか?
私はこれが遅い答えであることを知っていますが、これを行うためのクールな方法を見つけました。それは基本的にはHolger Justの答えですが、保存された構成ファイルでは:
これをlocal.machineの~/.ssh/config
ファイルに配置する必要があります(ファイルが存在しない場合は作成します)
Host target.machine
User targetuser
HostName target.machine
ProxyCommand ssh [email protected] nc %h %p 2> /dev/null
ファイルを保存した後、あなたはただ使うことができます
ssh target.machine
接続したいときはいつでも。 Scpは、ssh設定ファイルも考慮しているので機能します。GNOMEを使用していてGUIを使用したい場合は、Nautilusも機能します。
これで、*これをワンライナーとして実行できます要求なしnc
どこでも:
scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file .
説明
pcreds
およびtcreds
は、必要に応じてプロキシおよびターゲットの資格情報を表します(username
、username:password
など)。
これは、組み込みのnetcatのような機能により可能であり、中間ホストでのnc
の要件を削除します。 ssh -W Host:port
を使用すると、指定したホストとポートへのトンネルがセットアップされ、stdin/stdoutに接続されます。その後、scp
がトンネルを介して実行されます。
ProxyCommand
の%h
と%p
は、外側のscp
コマンドからのターゲットホストとポートに置き換えられ、それらを繰り返す必要がなくなります。
さらに便利なように、ssh構成でプロキシを構成できます。
Host target.machine
ProxyCommand ssh [email protected] -W %h:%p
そしてそれ以降は
scp [email protected]:file .
*OpenSSH 5.4以降- 2010年3月リリース
これは1つのコマンドで実行できますが、プロキシマシンにnetcat(nc)をインストールする必要があります。
ssh -o "ProxyCommand ssh [email protected] nc -w 1 %h 22" [email protected]
[編集:マシンの順序を混同...]
Scpの代わりにrsyncを使用してもかまわない場合は、次のワンライナーを使用できます。
rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/
(パスワードなしでプロキシマシンにアクセスする必要があります)
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .
OK、実際には2つのコマンド...
ワンライナー?私の頭の上からではありません。最初にプロキシを確立する必要があり、scpだけでそれを行うことはできません。
手動で行う場合、トンネルのスクリーンセッションを開きます。
screen -S tunnel
画面は、バックグラウンドシェルでトンネルを通過させるために使用されます。バックグラウンドでトンネルを開いたままにしたい任意の手法を使用します(@weeheavyの答えがおそらく最も簡単です)。スクリーンセッションに入ると、次のようにトンネルを開始します
ssh -L 2222:target.machine:22 [user@]proxy.machine
それを打破するために、それは基本的に「私のローカルマシンでポート2222を開き、localhost:2222にヒットするすべての接続は、proxy.machineを介してtarget.machine:22にプロキシされます」と述べています。
Ssh接続とトンネルを確立したら、「C-a d」を使用してscreenセッションから切り離します。そのスクリーンセッションに戻るには、screen -raAd tunnel
と入力します。
元のシェルに戻ると、scpコマンドは次のようになります。
scp -P 2222 localhost:your/file/on/target.machine local/path
Localhostポート2222は、実際にはtarget.machineに向かう単なるトンネルであることに注意してください。
Scpはsshと同じように「-o」オプションをサポートしているようですが、プロキシのユーザー名/パスワードを渡す方法はわかりません。
scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_Host:remote_path local_path
あなたが取得する場合 nc: invalid option -- X
参照 https://stackoverflow.com/a/23616021/3245
どうですか:
scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
あなたは次のようなことを試すことができます:
ssh [email protected] "ssh [email protected] 'cat > file'" < file
しかし、proxy.machineがパスワードを要求する必要がある場合は機能しません(そのSSHはTTYにないため、askpassは失敗します)。
複数のファイルがある場合は、次のようなtarを使用できます(テストされていません。通常、私はnetcatをそのまま使用します)。
tar cf - file1 file2 folder1/ | ssh [email protected] "ssh [email protected] 'tar xvf -'"
source_Hostからdestination_Hostにproxy_Hostを介してsource_fileを転送する別の簡単なソリューション:
proxy_serverにログインします。
ssh login@proxy_Host
プロキシサーバーから、source_fileをsource_Hostからdestination_Hostに転送します(これを1行として入力するか、\
を省略して、または以下に示すように2行):
scp login@source_Host:/path_to_source_file \
login@destination_Host:/path_to_destination_directory
これには、source_Hostからproxy_Hostへのログインにrsa_keyを使用する必要があります。
私はこの記事をたどって、私にとってうまくいく答えを見つけました。 (上記の答えは私にとってうまくいかないからです)。
中間ホスト(別名ジャンプホスト)を介してファイルをscp
する方法 http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-Host .html
そして私の答えは以下の通りです:
scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
{source_file} {remote_username}@{remote_IP}:{remote_file_path}
例:
scp -oProxyCommand="ssh -W %h:%p [email protected]" \
archive.gz [email protected]:/home/wise/archive.gz
この回答がお役に立てば幸いです。
公開鍵を使用する必要がある場合は、このようなものが必要になります。
Host target-machine
User target-user
HostName target.example.com
IdentityFile /path/to/file.pem
ProxyCommand ssh bastion -W %h:%p
Host bastion
User bastion-user
HostName bastion.example.com
IdentityFile /path/to/file.pem