Chris Sandoval Hidalgo Asked: 2021-10-27 15:50:51 +0800 CST2021-10-27 15:50:51 +0800 CST 2021-10-27 15:50:51 +0800 CST 如何在 SuSe 12 中创建随机复杂密码 772 我需要一种按照以下要求生成随机密码的方法: 密码至少 9 个字符 至少2个大写字母 至少 2 个小写字母 至少2位数 至少 2 个特殊字符 必须以字母开头 这是我的命令: { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; } | shuf | tr -d $'\n' 但缺少特殊字符 操作系统是 SuSE 12 password random 3 个回答 Voted golder3 2021-10-28T01:49:02+08:002021-10-28T01:49:02+08:00 看看如何生成随机字符串? 赫伯特建议使用/dev/urandom tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo 400 Cat 提供的解决方案openssl openssl rand -base64 12 问题是这些解决方案都不能保证您将拥有您想要的所有字符(即 2 个数字、2 个特殊字符等)。 使用shuf并基于您的原始代码,您可以执行类似的操作 shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n'; { shuf -r -n2 -e {0..9}; shuf -r -n2 -e {a..z}; shuf -r -n2 -e {A..Z}; shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - = . , : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n' 为了便于阅读,分为几行: shuf -r -n1 -e {a..z} {A..Z} | tr -d $'\n'; { shuf -r -n2 -e {0..9}; shuf -r -n2 -e {a..z}; shuf -r -n2 -e {A..Z}; shuf -r -n2 -e { \! \" \# $ % \& '\' '/' \( \) \{ \} [ ] \< \> + - = . , : \; ? @ \| \` \~ ^ _ "'" \* }; } | shuf | tr -d $'\n' 这将产生一个以字母开头的字符串(请注意,我没有将第一行输入 last shuf)并且有 2 个小写字母、2 个大写字母和 2 个数字(总共 9 个字符) Best Answer ilkkachu 2021-10-28T03:12:17+08:002021-10-28T03:12:17+08:00 您可以将特殊字符与 another 一起添加shuf,但不能使用大括号扩展和类似的范围。 但是您可以一一明确列出它们,并引用它们以保护它们免受外壳的影响: shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}' 或者将它们塞进一个字符串并使用分词将它们变成多个参数。但是,需要禁用 globbing set -f,否则星号会导致问题: set -f shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' ) (或者只是做每个人都做的事情,并在其他合理的密码末尾添加两个固定的特殊字符,即使没有它们也足够长。) 为确保您有一个字母作为第一个字符,最简单的方法是单独添加一个,然后仅将密码其余部分的字符随机排列。例如,这会将密码分为两部分,第一部分是单个字母(大写或小写),第二部分是您在评论中的内容: #!/bin/bash set -f pw=$(shuf -r -n1 -e {A..Z} {a..z}) pw="$pw$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )" echo "$pw" 输出将是这样的: $ bash pw.sh WRgpJ7pP%Tj60.1 $ bash pw.sh oV6N#7s4Po3Bt)r Chris Sandoval Hidalgo 2021-10-28T09:11:43+08:002021-10-28T09:11:43+08:00 最后,这是最终命令: export PASSWORD=$(shuf -r -n1 -e {A..Z} {a..z})$( { shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; shuf -r -n2 -e $(sed -e 's/./& /g' <<< '@%+\/!#$^?:.(){}[]-_.'); } | shuf | tr -d '\n' )
看看如何生成随机字符串?
赫伯特建议使用
/dev/urandom
400 Cat 提供的解决方案
openssl
问题是这些解决方案都不能保证您将拥有您想要的所有字符(即 2 个数字、2 个特殊字符等)。
使用
shuf
并基于您的原始代码,您可以执行类似的操作为了便于阅读,分为几行:
这将产生一个以字母开头的字符串(请注意,我没有将第一行输入 last
shuf
)并且有 2 个小写字母、2 个大写字母和 2 个数字(总共 9 个字符)您可以将特殊字符与 another 一起添加
shuf
,但不能使用大括号扩展和类似的范围。但是您可以一一明确列出它们,并引用它们以保护它们免受外壳的影响:
或者将它们塞进一个字符串并使用分词将它们变成多个参数。但是,需要禁用 globbing
set -f
,否则星号会导致问题:(或者只是做每个人都做的事情,并在其他合理的密码末尾添加两个固定的特殊字符,即使没有它们也足够长。)
为确保您有一个字母作为第一个字符,最简单的方法是单独添加一个,然后仅将密码其余部分的字符随机排列。例如,这会将密码分为两部分,第一部分是单个字母(大写或小写),第二部分是您在评论中的内容:
输出将是这样的:
最后,这是最终命令: