• 締切済み

多段SSHでのrsyncについて

localとBとをrsyncする方法について。 localから仲介サーバへは秘密鍵で認証させています。 ポートフォワーディングで下記のように接続し、 ssh -t -L ポート番号:サーバA:ポート番号 ユーザ名@サーバA ssh -t -L ポート番号:サーバB:ポート番号 ユーザ名@サーバB 接続されたポート番号からrsyncを実行すればうまくいくのでは?と思い 実行してみたのですが不明点がありうまくいきません。 不明点は、秘密鍵の認証をどこに記述すればよいのか・・・です。 ssh -i 秘密鍵path ユーザ名@サーバ ↑これを多段SSHのポートフォワーディングではどのように加えればいいのか・・・。 そもそも↑で提示しているポートフォワーディングのコマンド自体に誤りがあるかもしれません。 上記に対してのアドバイス、もしくは他の方法の提案等をして下さると幸いです。 宜しくお願い致します。

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

仲介サーバがAという事で良いのだろうか。 $ ssh -t -L ポート番号:サーバA:ポート番号 ユーザ名@サーバA ssh -t -L ポート番号:サーバB:ポート番号 ユーザ名@サーバB これだと、内側のsshはサーバAで実行されるため、localとBでrsyncできないね。sshでサーバAに行ってしまうと、その中で実行するコマンドの主体はサーバAになるため、その中でrsyncするならサーバAがlocalに向かってrsyncで取得したものをサーバAがサーバBに向かってrsyncで書き込むという流れにしないといけない。 AがlocalとBのrsyncを仲介する場合、localにAとBの秘密鍵を持つしかない。 local ↑↑ || 左がssh to B over ssh to Aで、右がssh to A |↓ |A | | ↓ B コマンド的には、localで2つの端末を開き、 $1 ssh -L 4422:サーバB:22 ユーザ名@サーバA これで、localから見るとlocalhost:4422にアクセスするとそれがサーバBのsshdにつながるようになる。そこで、 $2 rsync -avz --delete -e "ssh -p 4422" /home/ユーザ名 localhost:/home/ユーザ名 とでもすればいいのではないかな。実際試してないので分からんけど。 ただ、仮にやりたいことが夜間バッチによるバックアップだとすると、ひとつのトンネルを待ちうけ状態にしておかないといけないこの方法はそぐわない。 その場合は、OpenVPNなどでssh以外のトンネルをはるしかないんじゃないか。とにかく、行動の主体がlocalなままでlocalから(サーバAの後ろに隠れているのであろう)サーバBのsshへ直接接続できるようにならないとlocalからサーバBへのrsyncはできない。 --deleteの機能は使えなくなってしまうが、rsyncではなくtarとパイプでの転送を行うなら二重転送は問題なく行える。tarの例は以下のとおりで、この場合はトンネルではなく、localではtarで固めたものをそのまま標準出力に吐き、サーバBにssh接続するコマンドを実行するサーバAへのsshにパイプで流す。そうすると、今度はサーバAがサーバBの標準入力へ転送し、サーバBは標準入力からtarで中身を取り出して保存する。 $ tar cz -C /home ユーザ名 | ssh ユーザ名@サーバA -C "ssh ユーザ名@サーバB -C \"tar xz -C /home\"" sshで実行するコマンドとlocalで転送するファイルを固めるtarがパイプによって結ばれるためにお互いが相手のコマンドの実行を邪魔しないんだね。 この時、鍵を使うならlocal→サーバAの鍵と、サーバA→サーバBへの鍵が必要になる。

関連するQ&A