0
votes

Générer une chaîne aléatoire où il doit avoir un caractère spécial dans le script shell

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: xxx

sortie: A8Y34XFXC5AR < 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.

Veuillez suggérer comment atteindre cette exigence lorsque chaque chaîne générée doit respecter l'exigence mentionnée?


1 commentaires

TR -DC 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: {|} ~ '| Head -C 13; Echo`


3 Réponses :


2
votes

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 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.

quelque chose comme p>

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}"


0 commentaires

1
votes

Un dans awk: xxx pré>

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


0 commentaires

0
votes
openssl rand -base64 25
Change 25 to any amount of random characters you want to generate.

0 commentaires