用 Shell 编写一个 ZIP 炸弹
AI-摘要
TLDR GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
用 Shell 编写一个 ZIP 炸弹
lololowe介绍
ZIP 炸弹的具体介绍请看维基百科:https://zh.wikipedia.org/wiki/Zip_%E7%82%B8%E5%BC%B9
比较著名的 ZIP 炸弹是 42.zip,这是一个只有 42 KB 的压缩包,但全部递归解压后的大小为 4.5 PB( 4,718,592 GB)!
他的原理是非常简单的,就是创建一个 4 GB 大小的由全零填充的文件(压缩比接近 100%),再将此文件压缩成 16 份,接着再把这 16 个压缩文件压缩成一个压缩文件,然后再把这个压缩文件复制 16 份,再接着压缩成一个文件,总共重复 5 次,最终得到一个 42 KB 大小的 ZIP 文件。
制作 42.zip
使用下面的 shell 代码可以制作一个 42.zip:
1 | # 创建一个全零填充的 4GB 文件并将其压缩 |
注意:
- 使用 zip 命令前 cd 到目录内进行压缩的原因是,如果直接在外面进行压缩,会把目录名也压缩进去,即使指定了只压缩目录下的文件(zip -9 dir/*)也无效;
- 由于文件系统的影响(分配元数据,压缩效率等),最终得到的 42.zip 文件的大小不一定会是 42KB,但它的威力是一样的;
- 如果要给 42.zip 加上解压密码,则需要在 zip 命令后加上 -e 参数,终端会提示输入加密的密码。
更新:如果不考虑每个层级的文件命名,则可以使用嵌套循环优化重复代码:
1 | # 创建一个全零填充的 4GB 文件并将其压缩 |
递归解压
试试就逝世😎
Linux 自带的解压工具默认并不支持递归解压 ZIP 文件中的 ZIP 文件,可以使用以下 shell 代码实现递归解压:
1 | while find . -type f -name "*.zip" -exec unzip -- '{}' \; -delete |
非递归 ZIP 炸弹
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lololowe的博客!
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果