抱歉,如果这很简单,但是我找不到这个应该是简单问题的答案。
我只是将命令传递给 crunch:
$ crunch 3 3 aA -d 1@
我期望 crunch 生成包含 3 个字符的字符串,同时将小写字母的数量限制为 1:aAA
,AaA
,AAa
,AAA
。但是,我的输出是:
Crunch will now generate the following number of lines: 2
aAa
AaA
我尝试设置-d 1@ -d 3,
保留大写字母,但结果相同。我理解错了什么?
非常感谢您的回复,
答案1
我在这里理解错了什么?
crunch
不像这样工作,手册有点误导。一旦你理解了它的逻辑,它就说得通了;而要理解它,你需要示例(手册中有)、反复试验。
或者也许是这个答案。:)
来自手册:
crunch <min-len> <max-len> [<charset string>] [options]
[…]
charset string
您可以在命令行上指定 crunch 使用的字符集,或者如果您将其留空,crunch
将使用默认字符集。顺序必须是小写字符、大写字符、数字,然后是符号。如果您不遵循此顺序,您将无法获得想要的结果。您必须指定字符类型的值或加号。[…]
手册中提到“小写字符”、“大写字符”、“数字”和“符号”时,可能会说“集合 1”、“集合 2”、“集合 3”和“集合 4”。默认集合分别对应于手册使用的术语,但除此之外,“小写字符”只是一个抽象的“集合 1”。在此上下文@
中指的是“集合 1”,也%
指的是“集合 3”。该工具不会检查“集合 1”或“小写字符”是否确实是小写字符!
考虑这个命令:
crunch 1 1 aA bB cC dD
# ^^ these are "lower case characters"
# ^^ there are "upper case characters"
# ^^ these are "numbers"
# ^^ these are "symbols"
输出为
a
A
因为crunch
默认情况下只使用“小写字符”。如果我们明确告诉它使用“数字”
crunch 1 1 aA bB cC dD -t %
那么它将使用第三组符号:
c
C
您的原始命令
crunch 3 3 aA -d 1@
指定aA
为“小写字符”集。是的,你确实说crunch
那A
是“小写字符”。现在-d
:
-d numbersymbol
限制重复字符的数量。-d 2@
限制小写字母以输出像aab
和这样的aac
。aaa
不会生成,因为这是3个连续的字母a
。格式为数字然后是符号,其中数字是连续字符的最大数量,符号是要限制的字符集的符号,即@,%^
[…]
因此,您说crunch
任何“小写字符”(来自您的集合,即a
或A
)最多可以连续出现 1 次。实际上,您得到的输出既不包含aa
也不包含AA
。
有时忘记“小写字符”等,而用“集合 N”来思考会很有用。手册似乎固定在“小写字符”应全部为小写等前提上。不过(至少在 Ubuntu 中)有一个文件/usr/share/crunch/charset.lst
可以与一起使用-f
;它定义了混合四个基本集合或其片段的各种集合。这强烈建议任何充当“小写字符”(或“符号”,或……)的集合都得到默默支持。
因此,如果您需要生成字符串,使得第一个字符是a
,0
或 ,(
而第二个字符是a
,1
或)
,那么可以这样做:
crunch 2 2 'a0(' 'a1)' -t @,
试一试。aa
输出中出现了注意,但它既不是“a
来自第一个集合两次”,也不是“a
来自第二个集合两次”。模式@,
保证第一个a
来自第一个集合,第二个a
来自第二个集合。然而,当涉及到时,这种区别并不那么严格-d
。命令
crunch 2 2 'a0(' 'a1)' -t @, -d 1@
将要不是生成aa
。这一观察导致了以下技巧:
crunch 3 3 aA a -d 1,
输出为:
aAa
aAA
AaA
AAa
AAA
这几乎就是你想要的。机制似乎是这样的:
- 没有
-t
,所以该工具仅使用第一组。 - 它生成所有可能的输出(如
crunch 3 3 aA
)。 - 它会丢弃与 相矛盾的行
-d 1,
。此选项表示输出中不能有aa
。选项引用第二组并不重要,所有输出都来自第一组。没有aa
。句号。
你没有预料到,aAa
因为你误解-d 1@
为“限制重复的数量”,而它是“限制连续的重复”。
最后请注意,答案主要基于观察,而不是文档。特别是这个技巧似乎没有文档记录,它可能只是crunch
幕后工作的偶然结果。未来的升级可能会使该工具在这个问题上表现不同,而不会破坏记录特征。