如何在bash脚本中逐行获取crunch输出以暴力破解加密multibit.key钱包
问题根源
你当前使用的for password in $(crunch ...)写法依赖Bash的命令替换机制,必须等crunch进程运行结束、把所有生成的密码全部加载到内存完成单词拆分后,才会开始遍历执行解密逻辑。GB级的输出会直接占满内存,导致进程被系统OOM杀掉。
解决方案
改用管道直接把crunch的标准输出实时逐行传给while循环处理,无需缓存全量生成的密码,生成一个密码就立刻尝试解密。
修改后的完整代码
#!/bin/bash if [ $# -ne 1 ]; then echo "Usage: apply-guesses.sh [key file]" exit 1 fi echo "Key file: $1" # 管道实时传递crunch生成的密码,逐行处理 crunch 12 12 abcdefghjiklmnopqrstuvwxyz -t PASSWORD_BEGIN@@@@@ | while IFS= read -r password; do echo "------" echo "Attempting: $password..." # 2>/dev/null 隐藏openssl解密失败的报错信息,避免刷屏 if openssl enc -d -p -aes-256-cbc -md md5 -a -in "$1" -out recovered.key -pass pass:"$password" 2>/dev/null; then echo "Success!" # 杀掉当前脚本启动的crunch进程,避免继续生成无用密码 pkill -P $$ crunch break else echo "Failed" # 删除解密失败产生的无效残差文件 rm -f recovered.key fi echo "------" done
关键修改说明
- 移除了命令替换
$()的写法,改用管道对接crunch输出,完全没有全量内存缓存的开销 - 用
IFS= read -r password逐行读取密码:IFS=避免行首尾空白字符被截断,-r避免密码中的反斜杠被自动转义,保证读取到的密码和crunch生成的完全一致 - 额外增加了失败后清理无效文件、成功后自动终止crunch进程的逻辑,不需要手动干预停止
内容的提问来源于stack exchange,提问作者Fnr
相关产品推荐
相关产品推荐

