rsync 解决报错 Operation not permitted

rsync 报错信息如下:

rsync: chgrp "/sh_titles.txt.LeSd" (in ) failed: Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]

该报错信息说明 rsync 在尝试修改文件的所属组(chgrp)时遇到了权限问题,导致不能成功传输文件的属性,从而返回错误码 23。

下面是一些常见的导致原因和解决方法:

可能原因

  1. 权限不足
    运行 rsync 的用户并不具有目标文件或目录所在系统中修改文件组的权限。

  2. 文件系统限制
    有些文件系统(例如 NFS 挂载的文件系统)可能禁止普通用户修改文件的所有权或组属性。

  3. 非特权用户执行
    如果你在非 root 用户下执行 rsync,而该用户对远程目标文件系统没有足够的权限,就可能无法改变文件属性。

  4. SELinux / 安全模块限制
    在启用 SELinux 或类似安全模块的系统中,即使用户有一定权限,也可能因为安全策略导致修改属性失败。

  5. 挂载选项
    文件系统可能以 nosuid 或者 root_squash 等方式挂载,从而导致特定权限变更行为受限。

解决方法

方法一:忽略组属性同步 (有效)

如果不需要同步文件的组属性,可以添加相应的参数禁止 rsync 尝试修改组:

  • --no-g--no-group:忽略组信息同步
  • --no-p--no-perms:忽略权限同步(如果也不需要权限同步)

示例:

rsync -avz --no-group --no-perms source/ user@remote_host:/destination/

rsync -avz --no-g source/ user@remote_host:/destination/

这样,rsync 将不再尝试对文件组进行修改,从而避免该错误。

方法二:以 root 用户运行

如果你确实需要同步文件的权限和属性,尝试以 root 用户或者有特权的用户在目标主机执行 rsync

sudo rsync -avz source/ root@remote_host:/destination/

或在源和目的两端检查是否需要使用 sudo

sudo rsync -avz source/ user@remote_host:/destination/

方法三:更改目标目录权限或挂载方式

如果是 NFS 或其他网络文件系统导致权限受限:

  • 确认 NFS 服务端和客户端的挂载选项:

    • 是否有 root_squash 选项?这会将远程 root 用户权限降级。
    • 尝试重新挂载文件系统或者修改 NFS 服务端配置。
  • 确保 NFS 挂载点具备适当的权限允许属性修改。

方法四:SELinux 等安全策略

在启用 SELinux 的系统上,检查 selinux 的属性:

sestatus

如果启用,尝试临时关闭 SELinux 或调整策略:

setenforce 0

确认操作完毕后,可以再调整回原有策略。请谨慎处理 SELinux 配置,在生产环境修改前请评估安全影响。

方法五:使用 --chown 选项

在较新的 rsync 版本中,可以使用 --chown 来统一更改同步后的文件所有者与组:

rsync -avz --chown=user:group source/ user@remote_host:/destination/

通过这种方式,rsync 在传输时就强制文件以特定用户和组的身份创建,可能避开了手动 chgrp 的需要。

总结

  • 如果你不关心权限同步,可通过 --no-g--no-perms 参数禁止同步权限来绕过此问题。
  • 如果需要完整同步权限,考虑以有更高权限的用户运行 rsync,或调整 NFS/SELinux/文件系统的安全策略。
  • 在确保安全和权限需求的前提下,适当调整 rsync 参数和系统配置,即可解决 Operation not permitted 报错问题。

以下是 Rsync 的全部选项详细介绍:

通用选项

  • -v, --verbose:详细模式输出,会显示更多关于文件传输的信息,如正在传输的文件名、传输的字节数等。
  • -q, --quiet:安静模式,几乎不输出任何信息,仅在发生错误时显示。
  • -c, --checksum:通过校验和而不是文件大小和修改时间来决定是否需要传输文件,能更精确地判断文件是否相同,但可能会增加计算开销。
  • -a, --archive:归档模式,以递归方式传输文件,并保持文件的所有属性,包括权限、所有者、组、时间戳等,相当于 -rlptgoD 选项的组合。这是最常用的选项之一,用于完整地复制文件及其属性。
  • -r, --recursive:递归地复制目录及其子目录,即同步整个目录树结构。
  • -R, --relative:使用相对路径,在同步时保留源文件路径的相对结构。例如,rsync -R /a/b/c/file.txt /dest 会在 /dest 下创建 a/b/c/file.txt 这样的目录结构。
  • -b, --backup:备份目标文件,在覆盖目标文件前先对其进行备份。配合 --suffix 选项可以指定备份文件的后缀名,默认后缀为 ~
  • –suffix=SUFFIX:指定备份文件的后缀名,例如 --suffix=.bak 会将备份文件命名为 原文件名.bak
  • -u, --update:仅更新目标文件系统中比源文件旧的文件,目标文件较新时不会覆盖。
  • -d, --dirs:仅同步目录,不传输目录中的文件,用于创建空目录结构。
  • -l, --links:保留软链接,在同步时软链接会被原样复制,而不是跟随链接复制实际文件。
  • -L, --copy-links:跟随软链接,并复制链接指向的实际文件,而不是保留软链接本身。
  • –copy-unsafe-links:类似 -L,但即使链接指向的文件在源目录树之外,也会尝试复制。
  • –safe-links:默认选项,不复制指向源目录树之外的软链接。
  • -H, --hard-links:保留硬链接,同步时会保留源文件的硬链接关系。
  • -p, --perms:保留文件权限,同步后的文件将具有与源文件相同的权限设置。
  • -o, --owner:保留文件的所有者,只有在以超级用户身份运行时才有效。
  • -g, --group:保留文件的组所有权,确保同步后的文件所属组与源文件一致。
  • -D, --devices --specials:保留设备文件和特殊文件,如字符设备文件和块设备文件等。
  • -t, --times:保留文件的修改时间,使目标文件的修改时间与源文件相同。
  • -S, --sparse:对稀疏文件进行特殊处理,高效地传输稀疏文件,避免传输大量的零数据块。
  • -n, --dry-run:试运行模式,模拟同步操作,但不会实际传输文件或修改目标系统,用于预览同步效果。
  • -W, --whole-file:不进行增量传输,总是完整地传输文件,即使文件只有部分内容发生变化。
  • –max-size=SIZE:仅传输小于指定大小的文件,SIZE 可以是 K(千字节)、M(兆字节)、G(吉字节)等单位,例如 --max-size=10M
  • –min-size=SIZE:仅传输大于指定大小的文件,单位使用同 --max-size
  • –exclude=PATTERN:排除与指定模式匹配的文件或目录,PATTERN 可以是文件名、目录名或通配符模式,例如 --exclude='*.log' 会排除所有扩展名为 .log 的文件。
  • –exclude-from=FILE:从指定文件中读取要排除的文件或目录模式,每行一个模式。
  • –include=PATTERN:明确包含与指定模式匹配的文件或目录,即使它们可能被其他排除规则排除。
  • –include-from=FILE:从指定文件中读取要包含的文件或目录模式,每行一个模式。
  • –files-from=FILE:从指定文件中读取要传输的文件或目录列表,每行一个路径。

传输选项

  • -z, --compress:在传输过程中压缩文件数据,减少传输的数据量,提高传输速度,尤其适用于慢速网络连接。
  • –compress-level=NUM:指定压缩级别,NUM 取值范围为 1 - 9,1 表示压缩速度最快但压缩比最低,9 表示压缩比最高但速度最慢,默认级别为 3。
  • -P:等价于 --partial --progress,显示传输进度,并保留部分传输的文件。如果传输中断,可以从中断处继续。
  • –partial:保留部分传输的文件,以便在传输中断后可以从中断处继续传输,而不是重新开始。
  • –progress:显示传输进度,实时显示已传输的字节数和预计剩余时间等信息。
  • –bwlimit=RATE:限制传输带宽,单位为千字节每秒(KB/s),例如 --bwlimit=100 表示将传输带宽限制为 100KB/s。

远程连接选项

  • -e, --rsh=COMMAND:指定用于远程连接的 shell 命令,默认为 ssh。例如,rsync -e "ssh -p 2222" user@host:/path/to/source /local/dest 表示使用 SSH 连接到远程主机的 2222 端口进行同步。
  • –rsync-path=PATH:指定远程主机上 Rsync 命令的路径,当远程主机上 Rsync 不在默认路径时使用。例如,--rsync-path="/usr/local/bin/rsync"
  • –port=PORT:指定远程 Rsync 守护进程监听的端口号,用于连接远程 Rsync 服务,默认端口为 873。

Rsync 守护进程相关选项

  • –daemon:以守护进程模式运行 Rsync,用于提供远程同步服务。通常需要配合配置文件 /etc/rsyncd.conf 使用。
  • –config=FILE:指定 Rsync 守护进程的配置文件,默认配置文件为 /etc/rsyncd.conf
  • –address=ADDRESS:指定 Rsync 守护进程绑定的 IP 地址,默认为所有可用地址。
  • –port=PORT:指定 Rsync 守护进程监听的端口号,默认端口为 873。
  • –blocking-io:使用阻塞 I/O 模式,在某些情况下可能提高稳定性。
  • –no-detach:在守护进程模式下,不将进程分离到后台运行,主要用于调试。

其他选项

  • –version:显示 Rsync 的版本信息。
  • –help:显示 Rsync 的帮助信息,包括所有选项的简要说明。
  • –super:以超级用户权限运行某些操作,即使 Rsync 本身不是以超级用户身份启动的(部分系统可能不支持)。
  • –fuzzy:尝试模糊匹配文件,当文件在目标端找不到精确匹配时,按文件名相似性进行匹配传输。
  • –ignore-existing:跳过目标端已存在的文件,不进行任何比较和更新操作。
  • –delete:删除目标目录中源目录没有的文件,确保目标目录与源目录内容一致。
  • –delete-before:在传输新文件之前先删除目标目录中多余的文件,而不是在传输完成后删除。
  • –delete-after:在传输完成后再删除目标目录中多余的文件,这是默认的删除策略(如果使用了 --delete 选项)。
  • –delete-excluded:删除目标目录中与排除模式匹配的文件,即使这些文件在源目录中不存在。
  • –force:强制删除目标文件或目录,即使它们正被其他进程使用(谨慎使用)。
  • –ignore-errors:忽略 I/O 错误,继续尝试传输其他文件,通常与 --delete 选项一起使用。
  • –partial-dir=DIR:指定部分传输文件的临时存储目录,用于在传输中断后恢复传输。
  • –timeout=SECONDS:设置 I/O 操作的超时时间,单位为秒,当连接或传输操作在指定时间内无响应时,Rsync 将终止并报错。
### 解决远程操作不被允许的问题 当遇到 `Operation not permitted` 错误时,通常是因为权限不足或配置不当引起的。针对不同场景下的解决方案如下: #### Ubuntu SSH 权限恢复 对于因权限问题导致无法通过SSH正常访问Ubuntu的情况,可以尝试重置相关文件夹和文件的权限[^1]。虽然具体的脚本未提供,但一般可以通过以下命令来修复常见的SSH权限问题: ```bash sudo chown -R $USER:$USER ~/.ssh sudo chmod 700 ~/.ssh sudo chmod 600 ~/.ssh/authorized_keys ``` #### Ansible Synchronize 模块错误处理 如果是在使用Ansible的Synchronize模块时遇到了权限拒绝(code 12),这可能是因为当前执行同步任务的用户不是目标路径的所有者或者是由于SELinux策略阻止了该动作的发生[^2]。 为了克服这个问题,可以在playbook中加入额外参数以确保有足够的权限来进行所需的操作,比如利用become指令切换到具有适当权限的账户下运行特定的任务: ```yaml tasks: - name: Sync files with proper permissions synchronize: src: /source/path/ dest: /destination/path/ become: yes become_user: root ``` 另外,在某些情况下调整rsync选项也可能有所帮助,例如设置archive模式并忽略现有属性: ```yaml synchronize: mode: pull rsync_opts: - '--no-p' - '-a' ``` #### Electron-Vue 应用程序中的权限修正 在开发基于Electron框架的应用过程中碰到类似的权限异常,则可能是由渲染进程试图执行受限API调用所造成的。一种推荐的做法是对涉及敏感操作的部分代码做兼容性判断,并仅在主进程中安全地触发这些行为[^3]。 修改后的逻辑片段如下所示: ```javascript if (!electron.remote && persistedState.subscribeOnChanges()) { // 执行订阅变化的动作... } ``` 以上方法分别适用于不同的技术栈和技术环境,具体应用取决于实际的工作流以及系统的具体情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值