哦,就是 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 狂暴输出。

这块截图大约是 10KB 的数据

其实还有更壮观的 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 会干的事)。
这些想法没什么太多应用场景,就只是想想。