Lire un mot de passe sur l’entrée standard

Problème

Vous souhaitez lire une chaîne de caractères sur l’entrée standard, sans que les caractères tapés n’apparaissent à l’écran.

Solution

Changez les options du terminal pour qu’il n’affiche plus les caractères saisis au clavier.

Discussion

Contrairement à ce que nous pourrions penser, ce n’est pas en fermant l’entrée standard que nous empêchons les caractères tapés au clavier de s’afficher. Il faut changer l’option adéquate du terminal avec tcsetattr(). Voici le code qui arrête l’affichage des caractères entrés au clavier lors de l’exécution de fgets() et qui rétablit ensuite la situation :


void 
get_pwd (char *pwd, int len) 
{ 
  char *cr; 
  struct termios t; 
 
/* Désactive l'affichage des caractères. */ 
  tcgetattr (0, &t); 
  t.c_lflag &= !ECHO; 
  tcsetattr (0, TCSANOW, &t); 
 
/* Lit le mot de passe. */ 
  fgets (pwd, len, stdin); 
 
/* Réactive l'affichage des caractères. */ 
  tcgetattr (0, &t); 
  t.c_lflag |= ECHO; 
  tcsetattr (0, TCSANOW, &t); 
 
/* Supprime le caractère de fin de ligne  
 * et tout ce qui suit s'il est présent. 
 */ 
  if ((cr = strchr (pwd, '\n'))) 
    cr[0] = '\0'; 
}
 

Prototypes...

Pour consulter la suite, découvrez le livre suivant :
couv_EI3CACT.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Lire une chaîne de caractères depuis l'entrée standard
Suivant
Partager un identifiant de fichier entre deux programmes