如何在 rsync 传输期间跳过特殊/套接字文件?

如何在 rsync 传输期间跳过特殊/套接字文件?

使用以下命令。

rsync --archive --delete --partial --progress --recursive --no-links --no-devices --quiet source target

使用--no-links并且--no-devices已经。

获取诸如此类的错误消息。

rsync: mknod "/mnt/shared/backup/var/spool/postfix/dev/log" failed: Operation not permitted (1)

使rsync退出非零。这不好。破坏了我的备份脚本。 (我不想使用忽略此错误,以防|| truersync 由于“合法”原因(例如没有剩余磁盘空间)而失败。)

在此示例中,它是一个套接字文件。我不关心这种特殊文件。我可以让 rsync 忽略/跳过这些吗?

答案1

rsync -a --no-specials --no-devices会告诉 rsync 跳过这些文件。它仍然会打印一条信息消息,但如果没有其他错误发生,它将返回 0。

如果您不想传输一组已知路径,则可以将它们完全排除。另外,请传递-x跳过所有已安装文件系统的选项(包括/dev,它负责处理最大的罪犯),并且如果磁盘上有多个文件系统,请列出所有安装点(例如rsync -ax / /home /destination)。

rsync -ax --exclude='/var/spool/postfix/dev/*' / /mnt/shared/backup

如果这些都不令人满意,列出您要跳过的文件。请注意,如果某些文件名受到攻击者的控制,则可能会导致某些文件从备份中丢失。例如,如果他们创建一个名称为换行符的目录并创建一个*在其中调用的命名套接字,则使用 的输出find -type s作为排除列表将导致被/*排除。为了防止出现此类问题,请将有问题的名称排除在排除列表之外。

{
  cd /path/to/source &&
  find . -name '*[\[?*
]*' -prune -o \
               \( -type b -o -type c -o -type p -o -type s \) -print |
  sed 's/^\.//'
} | rsync -a --exclude-from=- /path/to/source /destination

答案2

也许你可以rsync与 一起使用find?像这样的东西:

find /your/source/dir -type s 1> /tmp/ignore-list
rsync <your options> --exclude-from=/tmp/ignore-list /your/source/dir/ /your/destination/dir/

相关内容