cómo generar solo un carácter especial en este generador de passwords

Tengo un command que genera una contraseña con múltiples caracteres especiales. ¿Cómo puedo hacer que genere solo 1 personaje especial?

# Generate a random password # $1 = number of characters; defaults to 32 # $2 = include special characters; 1 = yes, 0 = no; defaults to 1 function randpass() { [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]" cat /dev/urandom | tr -cd "$CHAR" | head -c ${1:-32} echo } 

Solutions Collecting From Web of "cómo generar solo un carácter especial en este generador de passwords"

Aquí hay un par de enfoques:

1. Itera hasta que obtenga una contraseña que le "gusta"

 while true do word=$(tr -cd "[:graph:]" < /dev/urandom | head -c ${1:-32}) if [[ "$word" =~ [[:punct:]].*[[:punct:]] ]] then echo "$word has multiple special characters - reject." continue fi if [[ "$word" =~ [[:punct:]] ]] then echo "$word has one special character - accept." break fi echo "$word has no special characters - reject." continue done 

Advertencia: esto puede llevar mucho time para una gran cantidad de caracteres (p. Ej.,> 16).

2. Deténgase después de get un carácter de puntuación

 n=${1:-32} if [ "$2" == "0" ] then CHAR="[:alnum:]" else CHAR="[:graph:]" fi word= for ((i=0; i<n; i++)) do thischar=$(tr -cd "$CHAR" < /dev/urandom | head -c 1) if ! [[ "$thischar" =~ [[:alnum:]] ]] # Probably equivalent to if [[ "$thischar" =~ [[:punct:]] ]] then # Got one special character – don't allow any more. echo "$thischar is a special character." CHAR="[:alnum:]" fi word="$word$thischar" done echo "$word" 

Tenga en count que esto obtiene el carácter especial en los primeros tres (por ejemplo, ab!defghijklmnopqrstuvwxyz123456 ) con mucha frecuencia. Además, teóricamente es posible get una contraseña sin caracteres especiales con este enfoque.

Creo que primero generaría 32 [:alnum:] caracteres y luego, opcionalmente, insertía un carácter especial:

 function randpass() { passwd=$( < /dev/urandom tr -cd "[:alnum:]" | head -c $1) if [ "$2" == "0" ]; then echo "$passwd" else spchar=$( < /dev/urandom tr -cd "[:punct:]" | head -c 1) pos=$((RANDOM%$1)) echo "${passwd:0:pos}${spchar}${passwd:pos+1:$1}" fi } 

Supongo que [:punct:] contiene todos los caracteres que considera "especiales".

La syntax $(( )) es una expansión aritmética de shell que genera un número aleatorio entre 0 y 31 (o lo que sea $1 es).

La syntax ${var:offset:length} es una expansión de parámetro de shell para devolver una subcadena de una cadena.

Simplemente cambie su command de head a -c 1 :

 # Generate a random password # $1 = number of characters; defaults to 32 # $2 = include special characters; 1 = yes, 0 = no; defaults to 1 function randpass() { [ "$2" == "0" ] && CHAR="[:alnum:]" || CHAR="[:graph:]" cat /dev/urandom | tr -cd "$CHAR" | head -c 1 echo }