Ich brauche eine Möglichkeit, ein zufälliges Passwort zu generieren, das diese Anforderungen erfüllt:
- Passwort mindestens 9 Zeichen
- mindestens 2 Großbuchstaben
- mindestens 2 Kleinbuchstaben
- mindestens 2 Ziffern
- mindestens 2 Sonderzeichen
- muss mit einem Buchstaben beginnen
dies ist der Befehl, den ich habe:
{ shuf -r -n4 -e {A..Z}; shuf -r -n4 -e {a..z}; shuf -r -n4 -e {0..9}; } | shuf | tr -d $'\n'
aber es fehlen die Sonderzeichen
Betriebssystem ist SuSE 12
Antwort1
Sie könnten die Sonderzeichen mit einem weiteren hinzufügen shuf
, dürfen aber keine Klammererweiterungen und ähnliche Bereiche verwenden.
Sie können sie jedoch explizit einzeln auflisten und in Anführungszeichen setzen, um sie vor der Shell zu schützen:
shuf -r -n2 -e '!' '"' '#' '$' % '&' '(' ')' '*' + , - . / : ';' '<' = '>' '?' @ '[' '\' ']' '^' _ '{' '|' '}'
Oder schieben Sie sie in einen String und verwenden Sie die Worttrennung, um sie in mehrere Argumente zu bringen. set -f
Allerdings müssen Sie das Globbing mit deaktivieren, da das Asterisk sonst Probleme verursacht:
set -f
shuf -r -n2 -e $(sed -e 's/./& /g' <<< '!"#$%&()*+,-./:;<=>?@[\]^_{|}' )
(oder machen Sie es wie alle und fügen Sie an das Ende eines ansonsten sinnvollen Passworts, das auch ohne sie lang genug ist, zwei feste Sonderzeichen an.)
Um sicherzustellen, dass das erste Zeichen ein Buchstabe ist, fügen Sie am einfachsten einen separat hinzu und mischen Sie nur die Zeichen des restlichen Passworts. So würde das Passwort beispielsweise aus zwei Teilen bestehen, wobei der erste ein einzelner Buchstabe (Groß- oder Kleinbuchstabe) ist und der zweite das, was Sie in den Kommentaren hatten:
#!/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"
Die Ausgabe sähe etwa so aus:
$ bash pw.sh
WRgpJ7pP%Tj60.1
$ bash pw.sh
oV6N#7s4Po3Bt)r
Antwort2
Schauen Sie sich anWie erzeuge ich eine zufällige Zeichenfolge?
herbert schlägt vor,/dev/urandom
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
400 die Cat bietet Lösung mitopenssl
openssl rand -base64 12
Das Problem besteht darin, dass keine dieser Lösungen garantiert, dass Sie alle gewünschten Zeichen (also 2 Ziffern, 2 Sonderzeichen usw.) haben.
Mit shuf
und basierend auf Ihrem Originalcode können Sie Folgendes tun:
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'
Zur besseren Lesbarkeit in Zeilen unterteilt:
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'
Dadurch wird eine Zeichenfolge erzeugt, die mit einem Buchstaben beginnt (beachten Sie, dass ich die erste Zeile nicht in die letzte weiterleite shuf
) und aus zwei Kleinbuchstaben, zwei Großbuchstaben und zwei Ziffern besteht (insgesamt 9 Zeichen).
Antwort3
Am Ende ist dies der letzte Befehl:
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' )