使用 bash 在终端中生成类似 macOS 的密码

使用 bash 在终端中生成类似 macOS 的密码

我想生成一个遵循 Apple 在帐户创建过程中提示的密码模式的密码。

密码字符串模式将如下所示xxxxxx-xxxxxx-xxxxxx。其中一个x是数字,一个x是大写字母。还需要包括连字符。

结果可能如下所示:abcdef-ghijk3-mnoPqr- 其中3是数字,P是大写字母。

有效输出为:

  • abcdef-ghijk1-mnoPqr1P
  • abcd3F-ghijkl-mnopqr3F
  • abcdef-Ghijkl-mn0pqrG0
  • abcdef-nhijk1-mnqrX1X

无效输出有:

  • aBCD3f-Nh1jk1-Mn0qr
  • AbcDwF-gH1jJl-mn0FqR

我如何使用典型的 bash 命令sedawk类似命令来做到这一点?

答案1

尽管我有警告评论,但

rndchar() {
    local i=$(( 1 + RANDOM % $# ))
    echo "${!i}"
}

makepasswd() {
    local chars=()
    for i in {1..16}; do chars+=("$(rndchar {a..z})"); done
    chars+=("$(rndchar {A..Z})")
    chars+=("$(rndchar {0..9})")

    mapfile -t chars < <(printf '%s\n' "${chars[@]}" | shuf)

    local IFS=
    printf '%s-%s-%s\n' "${chars[*]:0:6}" "${chars[*]:6:6}" "${chars[*]:12:6}"
}

然后

$ for in in {1..5}; do makepasswd; done
qek5qo-Mfwtqm-ujwrni
zkcfjd-gDgleh-zklhk2
Qureng-alsyus-y8nbvp
lbkusw-fSkqua-ghws4x
uKope4-vrzeqm-iwidgw

使用工具管道:需要作为随机字符生成器

makepasswd() {
    (   chars=$(openssl rand -base64 1024)
        tr -cd '0-9' <<<"$chars" | head -c 1
        tr -cd 'A-Z' <<<"$chars" | head -c 1
        tr -cd 'a-z' <<<"$chars" | head -c 16
    ) | sed 's/./&\n/g' \
      | shuf \
      | paste -d '' - - - - - - \
      | paste -d '-' - - -
}
$ for in in {1..5}; do makepasswd; done
aubbbm-qelNvl-0mbhbf
zyqvon-oqifkv-fkbgW2
wtzqpo-yl0mce-xaquhQ
xljzp8-xdfoeW-wxokxf
cqydyt-f6mwmn-vqLkce

答案2

openssl我没有使用而是使用了/dev/urandom.

#!/usr/bin/env bash

makepasswd() {
    (   chars=$(LC_ALL=C tr -dc a-zA-Z0-9 </dev/urandom | head -c 2000 ; echo '')
        tr -cd '0-9' <<<"$chars" | head -c 1
        tr -cd 'A-Z' <<<"$chars" | head -c 1
        tr -cd 'a-z' <<<"$chars" | head -c 16
    ) | sed 's/./&\n/g' \
      | shuf \
      | paste -d'\0' - - - - - - \
      | paste -d'-' - - -
}

for in in {1..5}; do makepasswd; done

让它在跨平台上更加强大是一个更好的主意吗?

相关内容