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

adr*_*nos 6 backup special-characters rsync devices

使用以下命令。

rsync --archive --delete --partial --progress --recursive --no-links --no-devices --quiet source target
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Gil*_*il' 6

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

如果您不想传输一组已知路径,则可以完全排除它们。此外,一定要传递-x跳过所有挂载文件系统的选项(包括/dev,它负责处理最大的违规者),如果有多个磁盘文件系统,请列出所有挂载点(例如rsync -ax / /home /destination)。

rsync -ax --exclude='/var/spool/postfix/dev/*' / /mnt/shared/backup
Run Code Online (Sandbox Code Playgroud)

如果这些都不令人满意,请列出要跳过的文件。请注意,如果某些文件名受到攻击者的控制,它们可能会导致某些文件从备份中被遗漏。例如,如果他们创建一个名为换行符的目录并创建一个*在其中调用的命名套接字,那么使用 的输出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
Run Code Online (Sandbox Code Playgroud)