Rsync 以及rsync-path

工作中需要将本地文件同步到远端服务器。远端服务器的ssh处于安全考虑禁止远程root登录, 普通用户远程登录后可以sudo操作需要root完成的任务。现在要将本地文件rsync到远 端服务器的root为所有者的目录下,怎么整?

如果root可以远程登录服务器的话,我们可以这样:

rsync -a -e "ssh" webdata/ [email protected]:/var/www/webdata/

可惜我们不能,因为我们是喜欢折腾懂得安全的老鸟,我们ssh只能用普通账号:

rsync -a -e "ssh" webdata/ [email protected]:/var/www/webdata/

在这里你只能用普通用户tony但是,远程服务器的webdata目录为root所拥有,tony在该目 录下没有直接的创建文件和子目录的权限。运行的结果会是类似下面的错误信息:

rsync: failed to set times on "/var/www/webdata/.": Operation not permitted (1)
rsync: recv_generator: mkdir "/var/www/webdata/awesome_dirs" failed: Permission denied (13)

如何用普通用户ssh到远程服务器,然后用sudo改变为root权限,然后再做文件同步的操作 。一通google之后发现rsync的rsync-path这个参数可以完美做到这个要求,只要将命 令行改为:

rsync -a -e "ssh" --rsync-path="sudo rsync" webdata/ [email protected]:/var/www/webdata/

rsync-path参数原本的目的是:当远程服务器上的rsync如果没有安装在默认路径下,我们 可以通过这个参数来指定远程服务器上rsync的位置,但事实上我可以在该参数里指定任何 远程服务器上的命令。在我们的例子中用了sudo rsync,表示先先用sudo切换权限 然后再调用远端服务器的rsync

但是执行这个命令的结果是,类似下面列出的另一个错误:-( 。

sudo: no tty present and no askpass program specified

这个原因是在我们用sudo切换用户权限时默认是要输入当前用户的密码。我们可以在远 端服务器的/etc/sudoers文件中添加下面设置,表示当执行rsync程序时, sudo可以不要求密码:

tony ALL= NOPASSWD:/usr/bin/rsync

到此我们就完全搞定了本文一开始的头疼问题。其实rsync-path还可以有一些其他的玩 法,比如:

rsync -aq –rsync-path=”mkdir -p /tmp/imaginary/ && rsync” file user@remote:/tmp/imaginary/

这表示在远端服务器先创建指定的文件目录,再将文件同步到该目录中。