You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:01:55