SSHで現在ログインしているサーバのファイルをログイン元のマシンにコピーする方法
解決済
回答 5
投稿
- 評価
- クリップ 1
- VIEW 5,599

退会済みユーザー
サーバA と サーバB があるとします。ここでユーザはまず サーバA にログインします。そして サーバA から SSH で サーバB につないだとします。以下のようなイメージです。
please login
username: hogehoge
password:
welcome to サーバA
hogehoge@サーバA ~$ ssh fugafuga@サーバB
welcome to サーバB
fugafuga@サーバB ~$
このとき、サーバB にいる状態で、サーバA にファイルをコピーするコマンドはありますでしょうか。つまり、サーバB の中からそのコマンドを実行すると、「サーバB のファイル → サーバA」というようにコピーできる、というコマンドです。
ユーザ名やサーバアドレスなどは冗長になるのでなるべくなら記述したくはありません。rsync
やscp
は、ログイン元のサーバ(この場合では サーバA)から実行するようことが想定されていると考えていますので、今回の目的が達せられるかはわかりません。
例えばrsync
やscp
ですと、「サーバB の中をls
やcd
で調べ回って、欲しいファイルがあったら手軽にコピーする」ということが面倒だと思います。したがってこのような質問をさせていただきます。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
サーバーBからAにSSH接続できるなら、そのままサーバーBからAにscpなどのコマンドが実行できます。
接続できないなら、サーバAからBに以下のようなオプションでログインすれば、サーバーBからAのSSHポートにトンネルが作成されます。
サーバーAからBにログイン:
$ ssh -R 10022:localhost:22 サーバーB
サーバーBからAにscpでファイルを送信:
$ scp fileB -P 10022 localhost:dirA/
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
何らかの方法によって逆方向のSSH接続経路を確保するのが一般的だと思いますが、別案としてZMODEMによる転送を提案してみます。
- 準備が面倒
- 大きなファイルの転送には向かない
などの問題がありますが、一度準備をしてしまえば以降は手軽にファイルが転送できるようになります。
ZMODEMは、現在のSSH接続上を通してファイルを転送するので、新たな接続を張る事無くファイルが転送出来ます。
必要なソフト
- lrzsz (両方のサーバ)
- GNU screen (受信側サーバ(サーバA)のみ)
サーバAにZMODEM受信プログラム、サーバBにZMODEM送信プログラムが必要になります。Unix系OSならばlrzszが一般的に用いられています。
また、サーバBからのZMODEM送信要求に対してZMODEM受信プログラムを起動する為の端末(または通信)プログラムが必要です。これはGNU screenを利用するのが楽でしょう。
どちらもLinuxの一般的なDistributionやFreeBSD等ならばOSのパッケージシステムでパッケージが提供されていると思います。
事前準備
まずサーバAでZMODEM受信プログラムのコマンド名を確認します。環境によって各コマンドの頭に l が付く場合(lrz等)と付かない場合(rz等)があるので、whichコマンド等でどちらなのかを確認します。
server-a$ which lrz
/usr/local/bin/lrz
server-a$ lrz --version
lrz (lrzsz) 0.12.20
GNU screenのデフォルト設定ではZMODEM受信プログラムとしてrzを使うようになっているので、受信コマンドがlrzだった時はlrzを使うように設定を変更する必要があります。
またZMODEM送信要求があった時に受信プログラムを起動するよう設定が必要となります。
以下の2行を ~/.screenrc に記述(追加)して下さい。
zmodem recvcmd "!!! lrz -vv -b -E"
zmodem catch
ZMODEM送信コマンドがrzだった場合はzmodem catch
のみ追加すればOKです。
ファイル転送の手順
まずサーバAにて、転送したファイルを置いておくディレクトリに移動し、そこでscreenを起動します。
server-a$ cd /some/where/dir
server-a$ screen
screenのスタートアップメッセージが出た場合はスペースキーを押して終了させて下さい。
screenを起動すると新しいシェルが起動されるので、サーバBにログインします。
サーバBでディレクトリを移動したりして、転送したいファイルが見つかったらlsz ファイル名
(もしくはsz ファイル名
)を実行します。
server-b$ lsz hogehoge.tar.gz
rz
:!!! lrz -vv -b -E
screenがZMODEM転送要求を捉えて、ZMODEM受信プログラムを起動する為のプロンプトを画面下部に表示しますので、そのままReturnキーを押すと転送が始まります。
そして転送が完了すると以下のように転送結果が表示されます。
server-b$ lsz hogehoge.tar.gz
rz
Receiving: hogehoge.tar.gz
Bytes received: 4994460/4994460 BPS:1304975
Transfer complete
server-b$
転送されたファイルは、screenを起動したディレクトリに作成されます。
転送後は、また別のファイルを探してlsz(sz)コマンドで転送する事が出来ます。
全ての転送が終わったらサーバBからログアウトし、screen内で起動されたシェルを終了するとscreenも終了します。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
「ログイン元のサーバ(この場合では サーバA)から実行するようことが想定されている」という考えはどこから出てきたのでしょうか? サーバBにいる状態でサーバAに書き込むことも読み込むことも問題なくできます。普通にrsyncかscpを使えばいいでしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
BサーバーからAサーバーログインできなければ無理かと思います。
一番簡単にできそうなのは、AサーバーにNFCか何かを入れて、Bサーバーにマウントしてしまう方法かと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
マシン | IP | 備考 |
---|---|---|
ローカル | 192.168.0.100 | 自分のマシン(private ip) |
サーバA | 192.168.0.101 | メンテ接続用マシン(private ip) |
サーバB | 12.23.45.55 | 実サーバー |
みたいな構成だとしたら、サーバBからサーバAは見えないので、サーバーB操作からのrsync,scp等は不可能だと思います。
ルーターのポートマッピング(NAT)設定を使うてもありますけど。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/12/28 15:36 編集
2017/12/28 15:45
2017/12/31 08:57