root 権限の必要なディレクトリに対してrsync する
CentOS のApache で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 の中の人に感謝。