root 権限の必要なディレクトリに対してrsync する

CentOSApache でDocumentRoot とされている/var/www/html をサーバ間で同期するために

% rsync -avz -e ssh --delete /var/www/html foo@example.com:/var/www/html

rsync を実行しても、foo に/var/www/html への書き込み権限がないため成功しない。
# PermitRootLogin yes な方は勝手にどうぞ。


NFS が使えれば手っ取り早いのだが、一つの解決策として
example.com に以下のスクリプトを置き(/home/foo/rsync.sh とする)

#!/bin/sh

/usr/bin/sudo /usr/bin/rsync $*

visudo で

foo ALL=(ALL) NOPASSWD: /usr/bin/rsync

と設定しておく。


あとはrsync コマンドに --rsync-path をつけて実行することで

% rsync -avz -e ssh --delete --rsync-path="/home/foo/rsync.sh" /var/www/html foo@example.com:/var/www/html

example.com 側ではsudo したrsync が走り、/var/www/html 以下に書き込みができる。


深夜に相談に乗ってくれたhasegaw blog の中の人に感謝。