我目前正在编写一个 bash shell 脚本来将我们的 svn 存储库的最新版本传输到网络服务器。这是使用 svn export 到服务器 A 并将其与网络服务器同步,创建一个特殊用户(称为 sync_user),在每一端(服务器 A 和网络服务器)具有足够的权限来执行这些更新。该脚本使用“su sync_user”来执行 svn export 和 rsync 作为 sync_user :
export -f sync_section
su sync_user -c "sync_section $source $tmp $dest"
其中 sync_section 是脚本中的一个函数:
# critical section which performs the actual website update (export & sync)
# takes 3 parameters: source, tmp, dest
function sync_section {
source=$1
tmp=$2
tmp_old=$tmp"_old"
dest=$3
#enter critical section
set -e
# export to temp folder on server A
svn export -q --force $source $tmp --native-eol LF
# rsync with remote live website folder.
rsync -avzhiO $tmp $dest
# clean up
rm -rf $tmp_old
mv -f $tmp $tmp_old
# exit critical section
set +e
}
这个想法是每个有权更新/同步网络服务器的人都知道sync_user的密码,因此可以进入“su sync_user”部分。
理论上听起来不错,但 rsync 对此设置不满意,并给我以下错误消息:(user_x 是调用脚本的用户)
#### rsync output:
building file list ... rsync: pop_dir "/home/user_x" failed: Permission denied (13)
rsync error: errors selecting input/output files, dirs (code 3) at flist.c(1314) [sender=2.6.8]
经过一番谷歌搜索后,我发现我遇到的问题是由 rsync 引起的,因为它要求 sync_user 对脚本调用者的主目录具有完全访问权限。那是对的吗?如果是这样,为什么?是否有解决方法?
注意:脚本中根本不使用用户的主目录。仅使用服务器 A 上的 /tmp/ 和网络服务器上的 /var/www/vhosts/。