世界!
我有一个备份脚本,可以为每个用户运行
rsync
并将他们的 /User/user
文件夹存档到我们的共享驱动器上。遇到一个有趣的问题 rsync
:当以当前用户身份从 shell 中以“sudo”形式执行脚本时,我无法保留其他用户的权限。它会出错并显示:rsync: chown <path> - operations not permitted(1)
在执行命令之前,我是否必须以 root 身份
chown
每个用户的文件夹?
正在使用和有问题的命令:
/usr/bin/rsync -av --human-readable --progress /Users/$name/ --exclude=".*" --exclude="Public" /Backup/$name\ -\ $(date +%m-%d-%y) --exclude=".*/"
谢谢!
这是因为目标位于已安装的网络卷上。您以 root 身份运行
rsync
,但这仅授予您更改本地(客户端)计算机上的所有权的权限 - 就文件服务器而言,您是经过身份验证的任何用户,即不是 root (除非您使用 NFS,在这种情况下会更复杂)。由于您已作为普通用户通过服务器身份验证,因此您在服务器上创建的所有文件都将归该普通用户所有,并且您无权更改它。
我看到两种可能的解决方案:
不要尝试在服务器上设置所有权。使用
rsync -rltgoDv ...
代替 rsync -av ...
。 -a
相当于-rlptgoD
;省略 -p
意味着它不会尝试设置目标文件的所有权,它只会将它们全部存储为当前(经过服务器验证)用户。如果您确实需要保留所有权(并且您的本地帐户与服务器上的帐户相同),请通过 SSH 运行 rsync 而不是文件共享,然后以 root 身份通过 SSH 进入服务器。像
rsync -av ... root@server:/Backup/$name\ -\ $(date +%m-%d-%y) ...
之类的东西
请注意,允许 root SSH 进入服务器通常是一个坏主意。如果你想这样做,我会创建一个 SSH 公钥/私钥对(带有加密的私钥),使用它进行身份验证,并将服务器配置为拒绝基于密码的 SSH 身份验证(至少对于 root 而言) .
我在使用 Ansible 脚本时遇到权限错误。
这些选项对我有用:
--no-o --no-g --no-perms
- name: Copying code
ansible.posix.synchronize:
src: ../../../
dest: "{{ project_path }}"
times: no
recursive: yes
rsync_opts:
- "--no-o"
- "--no-g"
- "--no-perms"
- "--exclude=node_modules"
- "--exclude=infra"
- "--exclude=.git"
- "--exclude=package-lock.json"