基于正则表达式生成密码字典:Bash脚本被系统终止求助
解决bash脚本生成密码列表时被系统终止的问题
我明白你的困扰——用bash大括号展开一次性生成所有符合规则的密码组合时,因为内存耗尽被系统强制终止了。咱们来拆解问题根源,再给出几个可行的解决方案:
问题根源
你的脚本里用了{a..f}{a..f}{A..Z}{0..9}{a..z}{a..z}这种大括号展开语法,bash的特性是先在内存中生成所有组合,然后才开始循环输出。咱们算一下总组合数:
{a..f}是6个字符,两次组合就是6×6=36种{A..Z}是26种,{0..9}是10种{a..z}两次组合是26×26=676种
总共有36×26×10×676=6,327,360个密码。这么多字符串一次性加载到内存里,会吃掉大量内存,而你的服务器剩余内存只有约392MB,显然撑不住,最终触发了系统的OOM(内存不足)杀手,终止了脚本。
解决方案
1. 改用嵌套循环,避免一次性生成所有组合
把大括号展开拆成多层嵌套循环,这样每次只生成一个密码,内存占用极低:
#!/bin/bash # 直接清空文件,比touch+rm更高效 > words.txt for c1 in {a..f}; do for c2 in {a..f}; do for c3 in {A..Z}; do for c4 in {0..9}; do for c5 in {a..z}; do for c6 in {a..z}; do echo "$c1$c2$c3$c4$c5$c6" >> words.txt done done done done done done exit 0
这个版本不会一次性把所有组合加载到内存,每次循环只处理单个字符的组合,内存占用几乎可以忽略。
2. 优化文件写入效率(可选)
上面的脚本每次echo >>都会打开和关闭文件,频繁IO会拖慢速度。可以把整个循环的输出一次性重定向到文件,减少IO操作:
#!/bin/bash > words.txt for c1 in {a..f}; do for c2 in {a..f}; do for c3 in {A..Z}; do for c4 in {0..9}; do for c5 in {a..z}; do for c6 in {a..z}; do echo "$c1$c2$c3$c4$c5$c6" done done done done done done > words.txt
这样所有输出会批量写入文件,速度会快不少。
3. 用Python替代bash(更高效)
如果bash循环速度不够,Python的itertools.product是生成器,不会一次性加载所有组合,内存占用极低,而且速度更快:
import itertools import string # 定义各位置的字符集 first_two = string.ascii_lowercase[:6] # 对应a-f third = string.ascii_uppercase fourth = string.digits last_two = string.ascii_lowercase with open('words.txt', 'w') as output_file: # 生成所有组合,逐个写入文件 for combo in itertools.product(first_two, first_two, third, fourth, last_two, last_two): output_file.write(''.join(combo) + '\n')
这个脚本运行时内存占用几乎可以忽略,适合资源有限的服务器。
补充说明
生成的words.txt文件大小大概是6327360 × 7字节 ≈ 44MB,你的服务器磁盘空间肯定足够,所以不用担心存储问题,重点就是避免一次性加载所有组合到内存。
内容的提问来源于stack exchange,提问作者ducktalez
相关产品推荐
相关产品推荐

