J'utilise / dev / urandom pour générer la chaîne spéciale mais j'ai vu que parfois un caractère spécial n'est pas inclus dans la chaîne générée: sortie: A8Y34XFXC5AR P> < P> Mon besoin est que la sortie de chaîne générée (en utilisant / dev / ur urandom) doit contenir une majuscule, une minuscule, un caractère spécial et un caractère numérique. P> Veuillez suggérer comment atteindre cette exigence lorsque chaque chaîne générée doit respecter l'exigence mentionnée? p> p>
3 Réponses :
Lorsque vous devez disposer de 4 types de caractères différents dans votre sortie, faites 4 chaînes ou tableaux (pour chaque type 1), utilisez-le aléatoire pour sélectionner un caractère de chaque chaîne / matrice et appendez-le comme vous avez déjà fait la longueur 12 .
Et quelque chose comme p> shuf code> 12 caractères lorsque vous ne voulez pas avoir la limite des chaînes possibles avec les 4 types différents comme les 4 premiers caractères.
printf -v small "%s" {a..z}
printf -v large "%s" {A..Z}
printf -v digit "%s" {0..9}
special='@#$%^&*+=<>?' # Edit: Single quotes, not double quotes
# Debug loop
for s in small large digit special; do
echo "str=${!s}"
done
get4() {
for s in small large digit special; do
echo "${!s}" | sed 's/./&\n/g' | grep . | shuf | head -1
done| tr -d '\n'
}
passw=$(echo "$(get4)$(cat /dev/urandom | tr -dc 'a-zA-Z0-9$%&%' | fold -w 8 | head -n 1)" |
sed 's/./&\n/g' | grep . | shuf | tr -d '\n')
echo "${passw}"
Un dans awk: Comme les classes de caractères n'ont pas la même taille et que 3 seulement sont autorisées à chaque classe avant que toutes les classes soient représentées, le hasard est probablement biaisé. P > Celui-ci obtient des caractères acceptés à partir de / dev / urandom code> (Eh bien, c'est readind à partir d'un fichier, alors que vous le pointe de la fois) et "imprimer`s tous correspondant jusqu'à ce que ctrl-c IT: P>
awk '{
for(i=1;i<=length();i++) {
chr=substr($0,i,1)
if(chr~/[a-zA-Z0-9$%&]/)
str=str chr
}
if(length(str)<12)
next
else
for(i=1;i<=length(str)-11;i++) {
sstr=substr(str,i,12)
if(sstr~/[a-z]/ && sstr~/[A-Z]/ && sstr~/[0-9]/ && sstr~/[$%&]/){
print substr(str,i,12)
i+=11
}
}
str=""
}' /dev/urandom
openssl rand -base64 25 Change 25 to any amount of random characters you want to generate.
TR -DC Code> Supprime les caractères non désirés, il ne "forcer" pas ceux-ci. Jetez un coup d'œil à cette Unix Stackexchange question. Je pense que ce wil travail pour vous:
dev / urandom tr -dc 'a-za-z0-9! "# $% &' \ '' '() * +, -. / :; ? @ [\] ^ _ code> {|} ~ '| Head -C 13; Echo`