我最近不是有备份vultr快照的想法吗,最后想出了一个极其生草的dd快照备份恢复法:既然dd大法可以用cat某个文件然后用ssh连接另外一台机子cat再管道dd的方式完成全盘恢复,如果我用for循环将某个discord drive或是guilded drive的文件列表里的所有链接全部curl一遍,然后管道dd,它是不是也能完成恢复?🤔
那么对应地,有什么办法能将(比如dd产生的)stdin流按照某个体积进行分割,然后上传到discord drive或者guilded drive?🤔
AYAYA
最后我发现split就可以做到这点,它不仅可以接受stdin而非文件名作为输入,可以按字节来分割文件,还能用一个filter参数来对每一个分割之后的文件执行命令(比如cat | upload
)而非保存成文件🤔而上传guilded的函数只需要将里面的cat $filename
便乘cat -
,它就能接受stdin为上传的内容了,换句话说,它完成了流式改造,可以作为管道的终点了(确信🤔
当然,filter里面的命令其实是在一个subshell里跑的,所以之前定义的两个函数需要以export -f
的方式给搞进subshell,不然split完全没法执行它们(恼🤔
这玩意现在跑一个小型文件随便跑(测试时我把文件大小设置成了1字节或者2字节),但我不清楚前面真的加dd了会发生什么(🤔或者我们肯定不会直接加dd,肯定要在后面管道一大堆东西,比如管道个gzip或者bzip2压缩一下,再管道个什么申必加密程序加密🤔
fischlthonk
其实gpg就能完成流式加密,毕竟和split一样,也是GNU套件之一(确信🤔
那么完整的备份命令应该就是dd if=/dev/vda -bs=1M | bzip2 | gpg -c | guildedantics_pipeline cosette.txt
,运行时会要求设个密码(确信🤔完整的恢复命令应该是guilded2stdout cosette.txt | gpg -d | bunzip2 | dd of=/dev/vda -bs=1M
,或者不dd直接保存成镜像文件传discord drive都行,运行时会问之前设置的密码(确信🤔
所以现在我要是想提取那些vultr快照的话,我甚至都不用租第二台机子连ssh(确信🤔
AYAYA
dd加上去的测试也大获成功,它运行的时候会先要求输入密码,然后它便开始dd读取硬盘内容并压缩,但它只有生成的东西达到200MB-114514字节后才开始上传guilded🤔另外,需要设置一个系统变量:export GPG_TTY=$(tty)
才能让gpg正确读取密码(当然如果用--passphrase
的话就可以免去这一步了🤔
最终的代码如下,想办法从vps启动system rescue cd,然后粘贴进它的终端或者ssh(推荐后者)就vans了:
https://cdn.discordapp.com/attachments/524633631012945922/993546800252334120/guildedantics.sh
测试了两遍,一遍复制粘贴了整个函数到ssh终端窗口里跑,另外一遍保存成了一个sh文件跑,都能完成上传,后者还有将结果保存回discord webhook的功能(确信🤔
下载测试也完成了,它也需要设置某系统变量才能让gpg输入密码(恼🤔如果它能正常解密解压的话,那么它应该会生成一个和备份的vps硬盘一样大(10GB)的文件,这一步也都完成了🤔