web-dev-qa-db-ja.com

Scpプロキシ経由でローカルマシンから1つのコマンドを使用して?

Local.machine、proxy.machine、およびtarget.machineがあります。 local.machineはtarget.machineと直接接続していませんが、proxy.machineを経由する必要があります。

Target.machineからlocal.machineにファイルをscpしたい。これは、local.machineから1つのコマンドだけで実行できますか?

54
grm

私はこれが遅い答えであることを知っていますが、これを行うためのクールな方法を見つけました。それは基本的には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も機能します。

64
user24925

これで、*これをワンライナーとして実行できます要求なしncどこでも:

scp -o "ProxyCommand ssh [email protected] -W %h:%p" [email protected]:file .

説明

pcredsおよびtcredsは、必要に応じてプロキシおよびターゲットの資格情報を表します(usernameusername: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月リリース

21
CupawnTae

これは1つのコマンドで実行できますが、プロキシマシンにnetcat(nc)をインストールする必要があります。

ssh -o "ProxyCommand ssh [email protected] nc -w 1 %h 22" [email protected]

[編集:マシンの順序を混同...]

19
Holger Just

Scpの代わりにrsyncを使用してもかまわない場合は、次のワンライナーを使用できます。

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(パスワードなしでプロキシマシンにアクセスする必要があります)

18
dubek
$ ssh -f -N -L <localport>:<target.machine:port> [email protected]
$ scp [email protected]:/remote/file -P <localport> .

OK、実際には2つのコマンド...

8
weeheavy

ワンライナー?私の頭の上からではありません。最初にプロキシを確立する必要があり、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に向かう単なるトンネルであることに注意してください。

6
whaley

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

3
rogerdpack

どうですか:

scp -o "ProxyCommand ssh [email protected] nc %h %p" your.filename [email protected]:/whatever_location
2
eggroll77

あなたは次のようなことを試すことができます:

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 -'"
1
Eric Darchis

source_Hostからdestination_Hostproxy_Hostを介してsource_fileを転送する別の簡単なソリューション:

proxy_serverにログインします。

ssh login@proxy_Host

プロキシサーバーから、source_filesource_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を使用する必要があります。

1
lomai

私はこの記事をたどって、私にとってうまくいく答えを見つけました。 (上記の答えは私にとってうまくいかないからです)。

中間ホスト(別名ジャンプホスト)を介してファイルを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

この回答がお役に立てば幸いです。

1
Wise Lin

公開鍵を使用する必要がある場合は、このようなものが必要になります。

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
0
Leo