グローバルサーバとローカルサーバ間でrsync(cron)

グローバルに公開しているコンテンツやデータベースをローカルサーバへrsyncでバックアップ。

その手順のメモ。

要件:

  • rsyncをcronで定期実行
  • バックアップ対象は既に、圧縮されているものとする
  • rsyncdなどは特に利用しない

手順:

  • リモートサーバのsshd設定を変更
    • rootユーザでのssh+rsync+cronを利用する為、以下のように設定を変更

$ sudo vim /etc/ssh/sshd_config

#PermitRootLogin no

PermitRootLogin forced-commands-only

$ sudo /etc/rc.d/init.d/sshd restart

  • ローカルサーバで、キーペアを作成
    • cronで利用する為、パスフレーズは空のものを準備する

$ sudo ssh-keygen -t dsa -N "" -f /root/.ssh/rsync

  • リモートサーバへ公開鍵を転送

$ sudo scp /root/.ssh/rsync.pub user@remote.example.com:~/

  • リモートサーバのauthorized_keysへ追記

$ sudo sh -c 'cat ~user/rsync.pub >> /root/.ssh/authorized_keys'

$ rm -f ~user/rsync.pub

  • コマンドを限定した、接続テスト
    • 実行できるコマンドを限定する為、テスト的にlsのみを設定

$ sudo vim /root/.ssh/authorized_keys

command="/bin/ls" ssh-dss AAA...

    • 接続テスト

$ sudo ssh -i /root/.ssh/rsync root@remote.example.com

.Xauthority .fonts.cache-1 .k5login .profile ref

.bash_history .gnupg .lftp .ssh supfile.ports

.cshrc .history .login XF86Config.new tmp

Connection to remote.example.com closed.

  • 公開鍵に指定するコマンドを得る

$ sudo rsync -vv -az -e "ssh -i /root/.ssh/rsync"  /home/backup/ root@remote.example.com:/home/backup/

Password:

opening connection using ssh -i /root/.ssh/rsync -l root remote.example.com rsync

--server -vvulogDtprz . /home/backup/

protocol version mismatch - is your shell clean?

(see the rsync man page for an explanation)

rsync error: protocol incompatibility (code 2) at compat.c(69)

  • rsync –server -vvulogDtprz . /home/backup/ からオプション -vv を取り除いたものを、リモートの /root/.ssh/authorized_keys に指定する

$ sudo vim /root/.ssh/authorized_keys

command="rsync --server -ulogDtprz . /home/backup/" ssh-dss AAA...

  • rsyncを実行

sudo rsync -vv -az -e "ssh -i /root/.ssh/rsync" root@remote.example.com:/home/backup/ /home/backup/

参考:

http://www2s.biglobe.ne.jp/~nuts/labo/inti/cron-rsync-ssh-nodaemon.html