如何在Bash中生成无重复字符的macOS合规密码?
用原生Bash工具生成无重复字符的macOS合规密码
为什么你之前的方法行不通?
tr 工具仅支持单个字符或字符集的处理,不支持正则表达式的反向引用。你用 tr -d '(.)\1{1,}' 实际上是删除了括号、点号、反斜杠、数字1等字符,而不是匹配连续重复的字符;tr -s 也只能压缩连续的相同单字符,无法处理正则匹配的重复模式,所以达不到需求。
解决方案:循环生成+过滤检查
利用原生工具组合,循环生成密码并检查是否符合要求,直到得到合格的结果。
场景1:禁止连续重复字符(如aa、44)
以下命令生成12位密码,包含大小写字母、数字、macOS允许的特殊字符,且无连续重复:
while true; do # 从/dev/urandom提取合规字符,生成12位候选密码 password=$(LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()_+-=' < /dev/urandom | head -c 12) # 检查是否存在连续重复字符,无则输出并退出循环 if ! echo "$password" | grep -qE '(.)\1'; then echo "$password" break fi done
LC_ALL=C:确保字符处理不受系统locale影响,避免乱码tr -dc '...':仅保留指定字符集中的字符(覆盖macOS密码要求的字符类型)grep -qE '(.)\1':静默检查是否有连续重复字符,无重复时返回非0值,触发输出
如果想用openssl rand替代/dev/urandom,可以用这个版本:
while true; do password=$(openssl rand -base64 10 | tr -dc 'A-Za-z0-9!@#$%^&*()_+-=' | head -c 12) if ! echo "$password" | grep -qE '(.)\1'; then echo "$password" break fi done
场景2:禁止所有重复字符(如abca中的a重复)
如果要求密码中每个字符都唯一,把检查逻辑替换为:
while true; do password=$(LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()_+-=' < /dev/urandom | head -c 12) # 拆分字符后检查是否有重复 if [ $(echo "$password" | fold -w1 | sort | uniq -d | wc -l) -eq 0 ]; then echo "$password" break fi done
fold -w1:将密码拆分为单个字符逐行输出sort | uniq -d:找出重复的字符wc -l:统计重复字符数量,为0则表示无重复
补充说明
macOS密码的核心要求通常包括:长度≥8位、包含大小写字母/数字/特殊字符中的至少3类,上述命令的字符集已覆盖所有类型,只需调整head -c后的数字即可修改密码长度。
内容的提问来源于stack exchange,提问作者Paulo Vieira Pirovani
相关产品推荐
相关产品推荐

