贡献者: addis
对任何人来说,文件备份有多重要这里就不多说了,有能力的同学完全可以自己搭建一个云备份系统,但本文介绍一种成本极低且安全高效的备份方案。
首先要介绍一些网盘的 “极速秒传” 功能:当你要上传一个文件,如果你或者其他任何网盘用户已经传过一个内容完全相同的文件(文件名不同没关系),那么客户端就会帮你秒传。也就是说客户端并不需要真的把这个文件重新上传一次,而是直接在你网盘中生成服务器上某个已有文件的 “快捷方式”。这是一个十分强大的功能,但也有弊端:如果网盘审核出某个文件违反了 “相关规定”,那么网盘就会将其替换成一个违规通知,那么这个文件的所有 “快捷方式” 也都变成了这个通知。另一方面,如果你的文件没有加密,你的文件可能有泄露的风险(例如账号被盗)。
这里推荐的方法是,把要备份的文件夹(假设名为 backup
)中的每个文件都分别加密压缩,然后上传到网盘,将其重命名为例如 backup-2020-01-01
。注意是每个文件压缩而不是整个文件夹压缩成一个大压缩包(方法见下文)。如果文件夹较大,第一次上传无疑需要较长时间(因为网盘不可能已经有你加密过的文件,无法秒传)。但从第二次开始我们就可以 “增量备份” 了,例如过了几天,backup
文件夹中增添/删除/重命名了一少部分文件,我们再次将这个文件夹的每个文件分别用相同的密码加密压缩再上传到网盘,重命名为 backup-2020-01-07
。这时你会发现没有改变过的文件(包括重命名的)都会被秒传,只有内容改变了的或者新增的文件才需要真正上传,所以这个过程所用的时间将比第一次大大缩短!这就是为什么我们要将每个文件分别压缩而不是一起压缩。
注意无论是否秒传,网盘都会按照文件的实际大小计算你所用的空间(这也是为什么网盘能以较低的会员费提供如此巨大的空间)。如果经过多次备份空间不够用了,那么可以在客户端上找到 “清理重复文件” 的功能,清理时可以选择保留最新版本的文件。清理完成后,所有内容完全一样的文件都只会再最新版本的备份文件夹中保留,使占用空间大大降低。但这样的弊端是,旧文件夹中的重复文件被删除。
# 文件加密
openssl aes-256-cbc -nosalt -in 文件名 -out 加密文件名 -pbkdf2 -pass pass:密码
# 文件解密
openssl aes-256-cbc -nosalt -d -in 加密文件名 -out 文件名 -pbkdf2 -pass pass:密码
# 字符串加密
echo '需要加密的字符串' | \
openssl enc -base64 -e -aes-256-cbc -nosalt -pbkdf2 -pass pass:密码
# 字符串解密
echo "需要解密的字符串" | \
openssl enc -base64 -d -aes-256-cbc -nosalt -pbkdf2 -pass pass:密码
要对文件夹中的每个文件和文件名加密,python 脚本见 “如何给文件加密(含 python 加密脚本)”。
(未完成:这里发现一个问题,似乎即使用同一个命令压缩出来的文件 hash 也是不同的,所以并不能触发秒传,我自己写过一个程序可以保证结果一致,但有没有 linux 的自带程序可以办到?)
关于这个操作,相信对 Bash 命令行 有一定了解的同学来说不是难事。