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 ?

331voto

SiGanteng Points 23915

Il suffit d'ajouter -s à votre appel de lecture comme suit :

$ read -s PASSWORD
$ echo $PASSWORD

29voto

SiegeX Points 32614

Mise à jour

Dans le cas où vous voudriez être plus fantaisiste en sortant un * pour chaque caractère qu'ils tapent, vous pouvez faire quelque chose comme ceci (en utilisant la méthode d'andreas read -s solution) :

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

Sans être fantaisiste

echo "Please enter your username";
read username;

echo "Please enter your password";
stty -echo
read password;
stty echo

24voto

lesmana Points 8125

Pour une solution qui fonctionne sans bash ou certaines fonctionnalités de read vous pouvez utiliser stty pour désactiver l'écho

stty_orig=$(stty -g)
stty -echo
read password
stty $stty_orig

14voto

mklement0 Points 12597

Voici une variation de l'excellente idée de @SiegeX * -solution d'impression pour bash avec support pour le retour en arrière ajouté ; cela permet à l'utilisateur de corriger leur entrée avec le backspace clé ( delete sur un Mac) comme c'est généralement le cas avec les invites de mot de passe :

#!/usr/bin/env bash

password=''
while IFS= read -r -s -n1 char; do
  [[ -z $char ]] && { printf '\n'; break; } # ENTER pressed; output \n and break.
  if [[ $char == $'\x7f' ]]; then # backspace was pressed
      # Remove last char from output variable.
      [[ -n $password ]] && password=${password%?}
      # Erase '*' to the left.
      printf '\b \b' 
  else
    # Add typed char to output variable.
    password+=$char
    # Print '*' in its stead.
    printf '*'
  fi
done

Note :

  • Quant à savoir pourquoi le fait d'appuyer sur le retour arrière enregistre le code de caractère 0x7f : "Dans les systèmes modernes, la touche d'effacement arrière est souvent mise en correspondance avec le caractère de suppression (0x7f en ASCII ou Unicode)." https://en.wikipedia.org/wiki/Backspace
  • \b \b est nécessaire pour donner l'apparence de en supprimant le caractère à gauche ; en utilisant simplement \b déplace le curseur vers la gauche, mais laisse le caractère intact ( non destructif retour en arrière). En imprimant un espace et en reculant à nouveau, le caractère semble avoir été effacé (merci, Le caractère d'échappement "backspace" ' \b ' en C, comportement inattendu ? ).

Dans un POSIX-only (par exemple, sh sur Debian et Ubuntu, où sh es dash ), utiliser le stty -echo approche (ce qui est sous-optimal, car il imprime rien ), car le read ne supportera pas l'option -s y -n options.

8voto

yerlilbilgin Points 1419

Un peu différent de (mais surtout semblable à) la réponse de @lesmana

stty -echo
read password
stty echo

simplement : cacher l'écho faites votre travail afficher l'écho

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