工作中需要将本地文件同步到远端服务器。远端服务器的ssh处于安全考虑禁止远程root登录,
普通用户远程登录后可以sudo操作需要root完成的任务。现在要将本地文件rsync
到远
端服务器的root为所有者的目录下,怎么整?
如果root可以远程登录服务器的话,我们可以这样:
rsync -a -e "ssh" webdata/ root@server.remotehost.com:/var/www/webdata/
可惜我们不能,因为我们是喜欢折腾懂得安全的老鸟,我们ssh只能用普通账号:
rsync -a -e "ssh" webdata/ tony@server.remotehost.com:/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/ tony@server.remotehost.com:/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/
这表示在远端服务器先创建指定的文件目录,再将文件同步到该目录中。