我想生成一个遵循 Apple 在帐户创建过程中提示的密码模式的密码。
密码字符串模式将如下所示xxxxxx-xxxxxx-xxxxxx
。其中一个x
是数字,一个x
是大写字母。还需要包括连字符。
结果可能如下所示:abcdef-ghijk3-mnoPqr
- 其中3
是数字,P
是大写字母。
有效输出为:
abcdef-ghijk1-mnoPqr
(1
和P
)abcd3F-ghijkl-mnopqr
(3
和F
)abcdef-Ghijkl-mn0pqr
(G
和0
)abcdef-nhijk1-mnqrX
(1
和X
)
无效输出有:
aBCD3f-Nh1jk1-Mn0qr
AbcDwF-gH1jJl-mn0FqR
我如何使用典型的 bash 命令sed
或awk
类似命令来做到这一点?
答案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
使用工具管道:需要开放式SSL作为随机字符生成器
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
让它在跨平台上更加强大是一个更好的主意吗?