多くの場合、私はこの状況に直面しています。リモートサーバーにsshしていくつかのプログラムを実行し、それらの出力ファイルをローカルマシンにコピーして戻したいのです。私がすることは、リモートマシン上のファイルパスを覚えて、接続を終了してから、scp user@remote:filepath .
明らかにこれは最適ではありません。私が探しているのは、接続を終了せずにローカルマシンにファイルをscpする方法です。私はいくつかの検索を行いましたが、ほとんどすべての結果は、すでに知っているローカルマシンからscpを実行する方法を教えてくれます。
これは可能ですか?さらに良いことに、ローカルマシンのIPアドレスを知らなくても可能ですか?
ローカルマシンで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
を実行するだけで解決する場合があります。
私は、SUで このワンライナーソリューション が、受け入れられた回答よりもはるかに簡単であることがわかりました。ローカルIPアドレスに環境変数を使用しているので、事前に知らないというOPの要望にも応えていると思います。
これに基づいて、ファイルを「ダウンロード」するbash関数を次に示します(つまり、SSHセッションからローカルマシン上の設定された場所にプッシュします)。
function dl(){
scp "$1" ${CLIENT_IP%% *}:/home/<USER>/Downloads
}
これで、dl somefile.txt
を呼び出すだけで、SSHがリモートに送信され、ローカルのダウンロードフォルダにsomefile.txt
が表示されます。
エクストラ:
注:これには、リモートからローカルマシンへのSSHアクセスが必要です(これは多くの場合当てはまりますか?)
マシンで実行されているローカルsshサーバーが必要な場合は、次のようにします。
scp [-r] local_content your_local_user@your_local_machine_ip:
とにかく、リモートコピーを作成するためにリモート接続を閉じる必要はありません。別のターミナルを開いてscpを実行するだけです。