使用 find 和 ssh 备份到异地服务器

使用 find 和 ssh 备份到异地服务器

我确信这个问题已经在许多网站上得到了零碎的回答,但不知何故,我似乎无法让它(作为一个整体)可靠地工作。

场景:我有一台服务器,我想在其上进行增量备份(我每天都在思考)。

我要备份的文件和目录位于目录:/home/和中/srv/samba/

备份应为 .tar.gz 到/mnt/backup/目录,文件名应类似于inc_backup_yyyymmdd.tar.gz.

成功创建 .tar.gz 后,应使用 ssh 将文件发送到异地服务器。

现在服务器每周创建一次完整备份,我以随机间隔手动将其发送到异地(.tar.gz 大小约为 60 GB,因此需要一段时间......)。

理想情况下,我只想 .tar.gz 常规文件和文件夹。以 . 开头的文件。和 ~ 以及以 . 开头的目录应被排除。

有一个例外
/home/[user]//srv/samba/[someshare]/文件夹中,我有“.recycle”文件夹,该文件夹应包含在备份中,但应应用文件排除。

例如

/home/user/.hiddendirectory/ (excluded)
/home/user/.hiddendirectory/myfile.txt (excluded)
/home/user/myfile.txt (included)
/home/user/.myfile.txt (excluded)
/home/user/~myfile.txt (excluded)
/home/user/mydirectory/myfile.txt (included)
/home/user/.recycle/ (included)
/home/user/.recycle/~tmpfile (excluded)
/home/user/.recycle/.myfile (excluded)
/home/user/.recycle/myfile.txt (included)

我开始使用查找:

请注意,以下命令包含非标准运算符(-not、-or),因此如果使用,请确保您的系统支持它们

find /home -not -path '*/\.*' ! \( -name '.*' -or -name '~*' \) -mtime -1

这似乎找到了我需要的文件和文件夹。但当我立即将其传输到 tar 时,它似乎忽略了所有排除项?

find /home -not -path '*/\.*' ! \( -name '.*' -or -name '~*' \) -mtime -1 -print0 | tar -zcvf /tmp/testbackup1.tar.gz --null -T -

我似乎使用以下方法得到了正确的结果:

find /home -not -path '*/\.*' ! \( -name '.*' -or -name '~*' \) -mtime -1 -print0 | tar -Avf /tmp/testbackup1.tar | gzip -c /tmp/testbackup1.tar > testbackup1.tar.gz

...但这似乎过于复杂,并导致一个空的 tarball,尽管 tar 大小很大?这些都没有考虑到 .recycle 包含。

额外的好处是加密的 tar.gz 以增加安全性。

使用 SSH 发送文件是比较简单的部分。

我的想法是将其放入一个脚本文件中,由 Cron 执行。

该脚本将:

  • 创建备份文件(处理命名过程)
  • 通过 SSH 将备份文件发送到异地服务器
  • 从 .recycle 目录中删除旧文件(例如 2 周)

(就地)完整备份将每月执行一次,并且还将处理旧备份文件的清理(2 个月)。

因此,最终我会有 2 个完整备份和大约 60 个增量备份。一旦删除完整备份,增量备份(指的是增量备份)也将被删除。所有备份文件都将位于现场和异地。

任何建议(甚至全新的方法)都非常感谢!

提前致谢!

相关内容