写这篇东西之前我一直觉得,"字典生成"四个字天然带着劝退气质——听起来像是只有搞安全测试的人才需要,而且似乎很枯燥。但真等你在实际场景里用过一次crunch,你会发现自己之前为了生成一个特定格式的字典写的那些Python脚本、Shell循环,全都是在给工具做苦力。
crunch是一个能在终端里直接按指定规则穷举生成字符串组合的小工具。它没有任何图形界面,不需要配置服务,拿到手就能跑。最小的一条命令,几秒钟内就能让你理解它的全部逻辑;但真正要把它的字符集、模式占位符、分块输出这些能力组合起来,又足够你在真实测试中省下大把时间。这篇文章不打算写成man手册的翻译版,我按自己从零上手到实际使用这条线,把crunch的常用功能、适用场景和踩过的坑完整说一遍。无论你是在做授权的安全评估、密码找回,还是单纯想批量测试一批弱口令,这篇都能直接照着用。
1. 先说清楚:crunch为解决什么问题而生
1.1 一个能直接命中痛点的场景
假设你现在需要验证某个系统里是否有人用"姓名拼音首字母+出生年月"当密码,而且你对这位用户的生日只掌握一个大概区间。手里没有任何现成字典能满足这种高度定制化的需求,现成的rockyou.txt动辄十几GB,里面绝大部分内容又是纯英文单词或常见弱口令,跑起来浪费算力不说,成功率还低。
这时候你的选择无非两条路:要么写一段嵌套循环脚本,用各种排列组合生成文本;要么找一个帮你干这件事的工具,把规则写在命令参数里。crunch就是后者。它做的唯一一件事,就是根据你给定的长度范围和字符集,按顺序穷举出所有可能的字符串,然后输出到屏幕、文件,或直接通过管道喂给下游工具。
1.2 和手写脚本相比,crunch到底强在哪
我自己以前写过一段生成8位纯数字字典的Python代码,逻辑很简单,三层for循环就够。但一旦规则复杂起来,比如"前两位必须是小写字母,第三位必须是大写字母,后面四位必须纯数字,而且不允许连续两位相同",手写循环就开始变得容易出错且难维护。crunch把这类规则抽象成了几个参数:最小长度、最大长度、字符集、模式占位符,几个选项组合一下就能表达清楚。
另外,crunch生成数据的速度和资源占用是经过优化的。它用C语言实现,不停往标准输出吐数据,几乎不占内存——不管你要生成的是1000行还是几十亿行,它的内存占用都保持在一个很低的水平。相比之下,如果图省事用某些脚本语言先把所有组合都装进内存再写文件,碰到稍大一点的字符空间,内存直接爆掉。
1.3 别把crunch理解成"破解工具"
这里值得多写一句:crunch本身是个纯字典生成器,它不连接任何目标系统,不做任何验证,也谈不上"攻击"。它输出的东西只是一个文本流。真正用它的人可能是做授权渗透测试的工程师,可能是忘了压缩包密码想枚举找回的普通用户,也可能是做安全意识培训时给员工演示弱口令风险的安全讲师。工具是中性的,区别只在于用的人是否在合法授权和合规范围内操作。我后面讲的所有案例,前提都是你对自己的资产或已获得授权测试的目标进行操作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 把第一条crunch命令跑通:几个最常用的参数
2.1 从最小可运行命令理解三个默认行为
crunch的基本格式是:
bash复制crunch <min-length> <max-length> [charset] [options]
当前三个参数都给你的时候,命令逻辑就清楚了。比如:
bash复制crunch 2 3 abc
这条命令的含义是:生成长度从2到3的所有字符串,字符集只包含 a、b、c 三个字符。输出内容大致是这样:
text复制aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
...
ccc
这里有几个值得注意的默认行为。第一,最小长度和最大长度是包含边界值的,2到3意味着长度为2和长度为3的都要生成。第二,字符集是位置参数,如果省略不写,crunch默认使用26个小写字母作为字符集。第三,所有生成结果默认直接打印到标准输出,也就是终端屏幕上。正因为第三个行为,当你生成的空间较大时,千万不要随手敲一条大命令就往终端上输出——那效果和直接把文件cat到屏幕上没有任何区别,终端会直接被刷爆,你还得手动中断进程。
2.2 结果落到文件:-o参数和Shell重定向
把输出保存到文件有两条路。一条是Unix原生的重定向:
bash复制crunch 4 4 abc > dict.txt
另一条是crunch自带的输出参数:
bash复制crunch 4 4 abc -o dict.txt
两者最终效果差别不大,但从
