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。
下面是一些常见的导致原因和解决方法:
可能原因
-
权限不足:
运行rsync
的用户并不具有目标文件或目录所在系统中修改文件组的权限。 -
文件系统限制:
有些文件系统(例如 NFS 挂载的文件系统)可能禁止普通用户修改文件的所有权或组属性。 -
非特权用户执行:
如果你在非 root 用户下执行rsync
,而该用户对远程目标文件系统没有足够的权限,就可能无法改变文件属性。 -
SELinux / 安全模块限制:
在启用 SELinux 或类似安全模块的系统中,即使用户有一定权限,也可能因为安全策略导致修改属性失败。 -
挂载选项:
文件系统可能以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 将终止并报错。