¿Cómo echo estrellas (*) al leer la contraseña con `leer`?

¿Qué debo hacer para codificar en Bash, si quiero hacer eco * s en lugar de caracteres de contraseña (o incluso simplemente ocultar los caracteres por completo) cuando el usuario escribe algo en el uso de read ?

Como señaló Mark Rushakoff , las read -s suprimirán el eco de los caracteres escritos en el aviso. Puede hacer uso de esa característica como parte de este script para hacer eco de los asteriscos de cada carácter escrito:

 #!/bin/bash unset password prompt="Enter Password:" while IFS= read -p "$prompt" -r -s -n 1 char do if [[ $char == $'\0' ]] then break fi prompt='*' password+="$char" done echo echo "Done. Password=$password" 

Me gustó mucho la respuesta que dio Wirone , pero no me gustó que el retroceso continuara eliminando los caracteres incluso en el indicador “Ingresar contraseña:”.

También tuve algunos problemas en donde presionar las teclas demasiado rápido causaría que algunos de los caracteres se impriman realmente en la pantalla … nunca es algo bueno cuando se solicita una contraseña. =)

La siguiente es mi versión modificada de la respuesta de Wirone que aborda estos problemas:

 #!/bin/bash unset PASSWORD unset CHARCOUNT echo -n "Enter password: " stty -echo CHARCOUNT=0 while IFS= read -p "$PROMPT" -r -s -n 1 CHAR do # Enter - accept password if [[ $CHAR == $'\0' ]] ; then break fi # Backspace if [[ $CHAR == $'\177' ]] ; then if [ $CHARCOUNT -gt 0 ] ; then CHARCOUNT=$((CHARCOUNT-1)) PROMPT=$'\b \b' PASSWORD="${PASSWORD%?}" else PROMPT='' fi else CHARCOUNT=$((CHARCOUNT+1)) PROMPT='*' PASSWORD+="$CHAR" fi done stty echo echo $PASSWORD 

read -s debería ponerlo en modo silencioso:

 -s Silent mode. If input is coming from a terminal, characters are not echoed. 

Vea la sección de read en man bash .

No sé sobre estrellas, pero St-Echo es tu amigo:

  #!/bin/sh read -p "Username: " uname stty -echo read -p "Password: " passw; echo stty echo 

Fuente: http://www.peterbe.com/plog/passwords-with-bash

Me gustaría agregar algo a la solución de Dennis Williamson :

 #!/bin/bash unset password echo -n "Enter password: " while IFS= read -p "$prompt" -r -s -n 1 char do # Enter - accept password if [[ $char == $'\0' ]] ; then break fi # Backspace if [[ $char == $'\177' ]] ; then prompt=$'\b \b' password="${password%?}" else prompt='*' password+="$char" fi done 

En el script de ejemplo anterior, se maneja el retroceso correctamente.

Fuente

 stty -echo read something stty echo 

impedirá que la entrada del usuario se repita en la pantalla para esa lectura. Dependiendo de lo que esté haciendo con las indicaciones, es posible que desee agregar un comando echo extra para generar una nueva línea después de la lectura.

Si no te importa que sea interactivo, simplemente puedes hacer

 read -s pass echo "$pass" | sed 's/./*/g' 

Esto mostrará un * para cada carácter de la contraseña ingresada después de presionar enter.

Acabo de hacer esta función específica de Bash basada en las respuestas de Dennis Williamson , Wirone y Logan VanCuren :

 ask() { local 'args' 'char' 'charcount' 'prompt' 'reply' 'silent' # Basic arguments parsing while [[ "${1++}" ]]; do case "${1}" in ( '--silent' | '-s' ) silent='yes' ;; ( '--' ) args+=( "${@:2}" ) break ;; ( * ) args+=( "${1}" ) ;; esac shift || break done if [[ "${silent}" == 'yes' ]]; then for prompt in "${args[@]}"; do charcount='0' prompt="${prompt}: " reply='' while IFS='' read -n '1' -p "${prompt}" -r -s 'char'; do case "${char}" in # Handles NULL ( $'\000' ) break ;; # Handles BACKSPACE and DELETE ( $'\010' | $'\177' ) if (( charcount > 0 )); then prompt=$'\b \b' reply="${reply%?}" (( charcount-- )) else prompt='' fi ;; ( * ) prompt='*' reply+="${char}" (( charcount++ )) ;; esac done printf '\n' >&2 printf '%s\n' "${reply}" done else for prompt in "${args[@]}"; do IFS='' read -p "${prompt}: " -r 'reply' printf '%s\n' "${reply}" done fi } 

Se podría usar como:

 $ ask Username Username: AzureDiamond AzureDiamond $ ask -s Password Password: ******* hunter2 $ ask First Second Third First: foo foo Second: bar bar Third: baz baz 
 #!/bin/bash echo "------------------------------" n=7 echo " Enter Password :" for (( i=1;i