144 votes

Masquage de l'entrée utilisateur sur le terminal sous Linux script.

J'ai un bash script comme le suivant :

#!/bin/bash

echo "Please enter your username";
read username;

echo "Please enter your password";
read password;

Je veux que lorsque l'utilisateur tape le mot de passe sur le terminal, celui-ci ne soit pas affiché (ou quelque chose comme *******) soit affiché). Comment puis-je réaliser cela ?

4voto

Dylan Points 155

J'aime toujours utiliser les caractères d'échappement Ansi :

echo -e "Enter your password: \x1B[8m"
echo -e "\x1B[0m"

8m rend le texte invisible et 0m rétablit le texte "normal". L'option -e rend possible les échappatoires Ansi.

Le seul problème est que vous pouvez toujours copier et coller le texte qui s'y trouve, donc vous ne devriez probablement pas utiliser cette option si vous voulez vraiment la sécurité.

Il permet simplement aux gens de ne pas regarder vos mots de passe lorsque vous les tapez. Ne laissez pas votre ordinateur allumé par la suite :)


NOTE :

Ce qui précède est indépendant de la plate-forme, pour autant qu'elle supporte les séquences d'échappement Ansi.

Cependant, pour une autre solution Unix, vous pouvez simplement dire à read pour ne pas faire écho aux personnages...

printf "password: "
let pass $(read -s)
printf "\nhey everyone, the password the user just entered is $pass\n"

2voto

tripleee Points 28746

Voici une variante de la réponse de @SiegeX qui fonctionne avec l'interpréteur de commandes Bourne traditionnel (qui ne prend pas en charge la fonction += affectations).

password=''
while IFS= read -r -s -n1 pass; do
  if [ -z "$pass" ]; then
     echo
     break
  else
     printf '*'
     password="$password$pass"
  fi
done

1voto

MikeW Points 11

Obtenir le nom d'utilisateur et le mot de passe

Rendez-le plus lisible, mais placez-le à un meilleur endroit sur l'écran.

#!/bin/bash
clear
echo 
echo 
echo
counter=0
unset username
prompt="  Enter Username:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $'\0' ]]; then
        break
    elif [ $char == $'\x08' ] && [ $counter -gt 0 ]; then
        prompt=$'\b \b'
        username="${username%?}"
        counter=$((counter-1))
    elif [ $char == $'\x08' ] && [ $counter -lt 1 ]; then
        prompt=''
        continue
    else
        counter=$((counter+1))
        prompt="$char"
        username+="$char"
    fi
done
echo
unset password
prompt="  Enter Password:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
    if [[ $char == $'\0' ]]; then
        break
    elif [ $char == $'\x08' ] && [ $counter -gt 0 ]; then
        prompt=$'\b \b'
        password="${password%?}"
        counter=$((counter-1))
    elif [ $char == $'\x08' ] && [ $counter -lt 1 ]; then
        echo
        prompt="  Enter Password:"
        continue
    else
        counter=$((counter+1))
        prompt='*'
        password+="$char"
    fi
done

1voto

nooblag Points 480

Une variation sur les excellentes contributions de @SiegeX et @mklement0 : masquer l'entrée de l'utilisateur ; gérer l'espacement arrière ; mais seulement l'espacement arrière pour la longueur de ce que l'utilisateur a entré (ainsi nous n'effaçons pas d'autres caractères sur la même ligne) et gérer les caractères de contrôle, etc... Cette solution a été trouvée aquí après avoir tant creusé !

#!/bin/bash
#
# Read and echo a password, echoing responsive 'stars' for input characters
# Also handles: backspaces, deleted and ^U (kill-line) control-chars
#
unset PWORD
PWORD=
echo -n 'password: ' 1>&2
while true; do
  IFS= read -r -N1 -s char
  # Note a NULL will return a empty string
  # Convert users key press to hexadecimal character code
  code=$(printf '%02x' "'$char") # EOL (empty char) -> 00
  case "$code" in
  ''|0a|0d) break ;;   # Exit EOF, Linefeed or Return
  08|7f)  # backspace or delete
      if [ -n "$PWORD" ]; then
        PWORD="$( echo "$PWORD" | sed 's/.$//' )"
        echo -n $'\b \b' 1>&2
      fi
      ;;
  15) # ^U or kill line
      echo -n "$PWORD" | sed 's/./\cH \cH/g' >&2
      PWORD=''
      ;;
  [01]?) ;;                        # Ignore ALL other control characters
  *)  PWORD="$PWORD$char"
      echo -n '*' 1>&2
      ;;
  esac
done
echo
echo $PWORD

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X