以 root 身份运行 rsync:不允许操作

问题描述 投票:0回答:2

世界!

我有一个备份脚本,可以为每个用户运行

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=".*/"

谢谢!

macos bash scripting permissions backup
2个回答
28
投票

这是因为目标位于已安装的网络卷上。您以 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 而言) .


0
投票

我在使用 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"
© www.soinside.com 2019 - 2024. All rights reserved.