bash - password - ¿Cómo echo estrellas(*) al leer la contraseña con `leer`?
if unix ejemplos (9)
¿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
?
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
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
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.
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
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.
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
.
#!/bin/bash
echo "------------------------------"
n=7
echo " Enter Password :"
for (( i=1;i<n;i++ ))
do
stty -echo
read -r -s -n 1 char
stty echo
echo -n "*"
pass+="$char"
done
echo " "
echo " Your password : $pass "
echo ""
echo "-------------------------------"
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.