web-dev-qa-db-ja.com

すでにリモートマシンにSSHでログインしているときに、ローカルにscpする方法は?

多くの場合、私はこの状況に直面しています。リモートサーバーにsshしていくつかのプログラムを実行し、それらの出力ファイルをローカルマシンにコピーして戻したいのです。私がすることは、リモートマシン上のファイルパスを覚えて、接続を終了してから、scp user@remote:filepath .

明らかにこれは最適ではありません。私が探しているのは、接続を終了せずにローカルマシンにファイルをscpする方法です。私はいくつかの検索を行いましたが、ほとんどすべての結果は、すでに知っているローカルマシンからscpを実行する方法を教えてくれます。

これは可能ですか?さらに良いことに、ローカルマシンのIPアドレスを知らなくても可能ですか?

25
laike9m

ローカルマシンでsshdを実行している場合、それは可能であり、送信IPアドレスを知っている必要はありません。 SSHポート転送が有効になっている場合、すでにssh接続を開いている場合でも、それを終了せずに安全なトンネルを開くことができます。

サーバーへのssh接続があると仮定します。

local $ ssh [email protected]
Password:
remote $ echo abc > abc.txt  # now we have a file here

次に、そのファイルをローカルサーバーにコピーする必要があります。何らかの理由で、新しい接続を開きたくありません。 OK、Enter ~Cを押してsshコマンドラインを取得しましょう(Enter、次にチルド、次に大文字のC):

ssh> help
Commands:
      -L[bind_address:]port:Host:hostport    Request local forward
      -R[bind_address:]port:Host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward

これは通常の-L/R/Dオプションと同じです。 -Rが必要なので、もう一度Enter ~Cを押して次のように入力します。

ssh> -R 127.0.0.1:2222:127.0.0.1:22
Forwarding port.

ここでは、リモートサーバーのポート2222をローカルマシンのポート22に転送します(ここでは、ローカルSSHサーバーをポート22で起動する必要があります。他のポートでリッスンしている場合は、22の代わりに使用します)。

次に、リモートサーバーでscpを実行し、ローカルマシンのポート22(ローカルsshdが実行されている)にマップされているリモートサーバーのポート2222にファイルをコピーします。

remote $ scp -P2222 abc.txt [email protected]:
[email protected]'s password:
abc.txt                   100%    4     0.0KB/s   00:00

できました!

remote $ exit
logout
Connection to example.com closed.
local $ cat abc.txt
abc

トリッキーですが、もし本当にできない別のターミナルからscpを実行するだけで解決する場合があります。

30
afenster

私は、SUで このワンライナーソリューション が、受け入れられた回答よりもはるかに簡単であることがわかりました。ローカルIPアドレスに環境変数を使用しているので、事前に知らないというOPの要望にも応えていると思います。

これに基づいて、ファイルを「ダウンロード」するbash関数を次に示します(つまり、SSHセッションからローカルマシン上の設定された場所にプッシュします)。

function dl(){
    scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}

これで、dl somefile.txtを呼び出すだけで、SSHがリモートに送信され、ローカルのダウンロードフォルダにsomefile.txtが表示されます。

エクストラ:

  • パスワードプロンプトを回避するためにrsaキー(ssh-copy-id)を使用しています
  • 私は this trick を見つけて、ローカルbashrcがscp呼び出しでソースされるのを防ぎました

注:これには、リモートからローカルマシンへのSSHアクセスが必要です(これは多くの場合当てはまりますか?)

1
brotherJ4mes

マシンで実行されているローカルsshサーバーが必要な場合は、次のようにします。

    scp [-r] local_content your_local_user@your_local_machine_ip:

とにかく、リモートコピーを作成するためにリモート接続を閉じる必要はありません。別のターミナルを開いてscpを実行するだけです。

0
Javier S.