一种基于终端输出的数据传输方式
哦,就是 base64 嘛。
最近 scaleway 服务很不稳定,终有一天它失联了。
根据以前的经验,一般是机器重启,需要去网页 TTY 重置下网络。
登录后,scaleway 问我,新的网络上线,更快更好,要不要一键 auto migrant?
一手贱,然后就双向失联了。具体表现为什么都 ping 不通,没有任何公网地址,连 apt update 也无法运行,通过 scw 分配 IP 也救不活。
此时 sacleway 后台弹出马后炮提示:您的套餐迁移时如果分配了静态 IP,需要先升级 blablabla,否则就会丢失网络连接。怎么救,没说。
这台服务器主要运行了这个博客,尽管文章在本地都有备份,但还是想着先抢救一下数据库。
我使用的是 sqlite 数据库,就一个/wp-content/database/.ht.sqlite
文件。
抢救一下
网络彻底失联的情况下,我和这台机器唯一的交互手段就只有后台提供的网页版的 TTY。于是,只能靠屏幕输出了。
具体而言的话:
f=".ht.sqlite"; zip -9 -q f "$f"; base64 -w0 f.zip;echo "";
将输出保存到文件,从另一台机器
base64 -d save.txt > f.zip
进一步压缩
之前是针对空白系统的抢救办法。由于屏幕的输出空间很有限,结合一些工具的话,可以进一步缩减体积。
apt-get install sqlite3 p7zip-full python3-pip pip install base2048
f=".ht.sqlite"; sqlite3 $f 'VACUUM;'; :<<eof - or dump to sql - sqlite3 $f .dump > dump.sql; f="dump.sql"; eof 7z a -bso0 -mx -myx -mmt=off -ms=on -mtm=off -mtc=off -mta=off -m0=LZMA:d=384m:fb=273:lc=4 -mmc=1000000000 f $f; python3 -c "print(__import__('base2048').encode(open('f.7z','rb').read()))";
等待 TTY 狂暴输出。
其实还有更壮观的 base65536,输出的都是形似汉字的字符,但复制时可能会造成数据错乱。另一方面,base2048 屏幕输出占一个 ASCII 码的宽度,能容纳 2 个 ASCII 码的数据,而 base65536 占 2 个 ASCII 码的宽度,能容纳 3 个 ASCII 码的数据,压缩比提升不大且异常卡顿,实测还是 base2048 好。
恢复数据:将 TTY 打印的内容放入 2048.txt,然后恢复到 2048.7z。
其中明文数据大约是解码数据的 1.8 倍。
import base2048 with open('2048.txt', 'r',encoding='utf-8') as file: encoded_data = file.read() decoded_data = base2048.decode(encoded_data) with open('2048.7z', 'wb') as output_file: output_file.write(decoded_data)
更多可能
终端还可以展示带颜色的文字,用以进一步扩充符号数。如果能够显示图片,则可以结合一些隐写方法,将数据压缩到 RGB 值内。又或者结合屏幕刷新 + 录像,以类似二维码的原理定位和容错,并提供自动化的可能。
这样即使不需要数据线和网络,也能把电脑文件复制到手机上(当然首先要能在宿主上执行程序,听上去像是 007 会干的事)。
这些想法没什么太多应用场景,就只是想想。