使用Perl进行简单安全的备份

最近我在寻找一个备份解决方案,最终自己动手制作了一个。结果是 Stasis,这是一个使用 targpg 压缩和加密文件的Perl程序。

工作原理

Stasis会接受文件和目录路径列表,并使用tar构建一个临时的压缩gzip存档。然后,它使用AES 256位加密临时存档,将其保存到新位置,并删除临时存档。Stasis支持使用密码短语或GPG密钥进行备份。

示例

假设我想备份主家目录中的所有文件。我会创建一个名为files_to_backup.txt的文本文件,其中包含

/home/dfarrell/Documents
/home/dfarrell/Downloads
/home/dfarrell/Music
/home/dfarrell/Pictures
/home/dfarrell/Videos

我可以将这些目录和文件保存到Dropbox

$ stasis --destination ~/Dropbox --files files_to_backup.txt --passphrase mysecretkey

或者更简洁地

$ stasis -de ~/Dropbox -f files_to_backup.txt --passphrase mysecretkey

使用passfile而不是密码短语

$ stasis -de ~/Dropbox -f files_to_backup.txt --passfile /path/to/passfile

使用“referrer”参数提供GPG密钥而不是密码短语

$ stasis -de ~/Dropbox -f files_to_backup.txt -r keyname@example.com

忽略匹配.stasisignore中模式的文件。如果我想忽略某些类型的文件,例如OSX的.DS_Store索引文件,或者更广泛地说,所有隐藏文件:.*,这将很有用。

$ stasis -de ~/Dropbox -f files_to_backup.txt -r keyname@example.com -i .stasisignore

限制备份数量

Stasis接受--limit选项,只保留最近的x个备份

$ stasis -de ~/Dropbox -f files_to_backup.txt -r mygpgkey@email.com --limit 4

它和--days选项配合使用非常好,这个选项告诉stasis只在x天内没有创建新的存档时才创建新的存档。因此,为了保留一个月的周存档,我可以这样做

$ stasis -de ~/Dropbox -f files_to_backup.txt -r mygpgkey@email.com --limit 4 --days 7

现在stasis将只保留最后4个存档,并且每周只创建一个新存档。我的个人笔记本电脑并不总是开启,所以我有一个每30分钟检查一次的cron作业

*/30 * * * * stasis -de ~/Dropbox -f files_to_backup.txt -r mygpgkey@email.com -l 4 -da 7

恢复备份

首先用gpg解密备份

$ gpg -d /path/to/backup.tar.gz.gpg > /path/to/output.tar.gz
gpg: AES256 encrypted data
gpg: encrypted with 1 passphrase

GPG将要求输入密码短语或GPG密钥密码来解锁数据。然后你可以使用tar检查解密存档的文件

$ tar --list -f /path/to/output.tar.gz

或者

$ tar -zvtf /path/to/output.tar.gz

解压存档

$ tar -zvxf /path/to/output.tar.gz

Stasis的缺点

Stasis符合我的需求,但它有几个缺点,可能不适合你。首先,每次运行时它都会创建一个独立的加密存档,而不是增量备份。尽管这很简单,但它也浪费了空间,因此如果你打算保留许多备份副本,请考虑其影响。因为Stasis创建它存档的数据的临时副本,它还需要足够的磁盘空间来创建两个压缩存档。

由于Stasis每次都会创建一个新的存档,备份可能是一个资源密集型的过程。在我的超薄笔记本上,Stasis大约需要20秒来创建一个新的400MB新存档。如果你打算存档大量数据,你可能需要另一个解决方案。

存档名称是固定的,不应更改。Stasis使用ISO 8601日期时间创建加密存档的文件名,如:stasis-0000-00-00T00:00:00.tar.gz.gpg。为了检测备份目录中的以前备份文件,Stasis会在备份目录中查找匹配此模式的文件。当你使用--limit选项时,这一点很重要。

Stasis速查表

stasis [options]

Options:

  --destination -de destination directory to save the encrypted archive to
  --days        -da only create an archive if one doesn't exist within this many days (optional)
  --files       -f  filepath to a text file of filepaths to backup
  --ignore      -i  filepath to a text file of glob patterns to ignore (optional)
  --limit       -l  limit number of stasis backups to keep in destination directory (optional)
  --passphrase      passphrase to use
  --passfile        filepath to a textfile containing the password to use
  --referrer    -r  name of the gpg key to use (instead of a passphrase or passfile)
  --temp        -t  temp directory path, uses /tmp by default
  --verbose     -v  verbose, print progress statements (optional)
  --help        -h  print this documentation (optional)

更新:添加了关于--days选项的新部分,删除了脚本部分 2016-04-02
这篇文章最初发布在PerlTricks.com

标签

David Farrell

大卫是一名专业程序员,他经常在推特博客上分享关于代码和编程艺术的见解。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在GitHub上创建问题或拉取请求来帮助我们。