Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

script bash : demander à l'utilisateur de saisir mot de passe sans qu'il s'affic he etc.

13 réponses
Avatar
Francois Lafont
Bonjour à tous,

Avec le petit script ci-dessous, l'utilisateur doit saisir un mot de
passe (qui s'affiche en clair) et celui est ensuite stocké dans une
variable :

#---------------------------
echo -n "Votre mot de passe : "
read
mdp="$REPLY"
#---------------------------

Q1 : certes le mot de passe s'affiche, mais au delà de cet inconvénient,
la saisie qu'a faite l'utilisateur est-elle stockée quelque part dans un
fichier (une fois qu'il a fermé son terminal) ?

Q2 : existe-t-il un moyen (simple si possible ;-)) en bash de faire un
script qui se comporte comme la commande passwd par exemple, dans le
sens où le mot de passe saisi par l'utilisateur ne s'affiche pas, tout
en étant bien sûr enregistré par le script ?

Merci d'avance pour votre aide.


--
François Lafont

10 réponses

1 2
Avatar
YBM
Le 20.02.2012 13:07, Francois Lafont a écrit :
Bonjour à tous,

Avec le petit script ci-dessous, l'utilisateur doit saisir un mot de
passe (qui s'affiche en clair) et celui est ensuite stocké dans une
variable :

#---------------------------
echo -n "Votre mot de passe : "
read
mdp="$REPLY"
#---------------------------

Q1 : certes le mot de passe s'affiche, mais au delà de cet inconvénient,
la saisie qu'a faite l'utilisateur est-elle stockée quelque part dans un
fichier (une fois qu'il a fermé son terminal) ?



Je ne crois pas.

Q2 : existe-t-il un moyen (simple si possible ;-)) en bash de faire un
script qui se comporte comme la commande passwd par exemple, dans le
sens où le mot de passe saisi par l'utilisateur ne s'affiche pas, tout
en étant bien sûr enregistré par le script ?



trap "stty echo" EXIT HUP INT QUIT
stty -echo
read mdp
stty echo
trap - EXIT HUP INT QUIT
Avatar
Luc.Habert.00__arjf
Francois Lafont :

#---------------------------
echo -n "Votre mot de passe : "
read
mdp="$REPLY"



Tu peux faire directement

echo -n "Votre mot de passe : "
read -r mdp

, et ça t'évite d'etre dépendant d'une basherie.

Q1 : certes le mot de passe s'affiche, mais au delà de cet inconvénient,
la saisie qu'a faite l'utilisateur est-elle stockée quelque part dans un
fichier (une fois qu'il a fermé son terminal) ?



Éventuellement dans le swap. Si mdp est une variable d'environnement, et non
une simple variable de shell, elle sera visible des autres process du meme
utilisateur (cela dit, ils peuvent aussi taper directement dans la mémoire
de ton shell, mais c'est un peu plus difficille qu'un simple "ps e").
Avatar
Francois Lafont
Le 20/02/2012 13:15, YBM a écrit :

Q1 : certes le mot de passe s'affiche, mais au delà de cet inconvénient,
la saisie qu'a faite l'utilisateur est-elle stockée quelque part dans un
fichier (une fois qu'il a fermé son terminal) ?



Je ne crois pas.



Ok.

Q2 : existe-t-il un moyen (simple si possible ;-)) en bash de faire un
script qui se comporte comme la commande passwd par exemple, dans le
sens où le mot de passe saisi par l'utilisateur ne s'affiche pas, tout
en étant bien sûr enregistré par le script ?



trap "stty echo" EXIT HUP INT QUIT
stty -echo
read mdp
stty echo
trap - EXIT HUP INT QUIT



Merci pour la réponse qui semble parfaitement fonctionner. Ça ne doit
pas être très compliqué, mais je ne connais pas du tout les deux
commandes trap et stty. Je vais me documenter.

Merci beaucoup YBM. :-)

--
François Lafont
Avatar
Luc.Habert.00__arjf
Francois Lafont :

mais je ne connais pas du tout les deux commandes trap et stty.



stty fait le boulot de désactivation de l'echo de ce qui est tapé par
l'utilisateur (stty -echo) puis réactivation (stty echo).

trap permet d'installer un signal handler. Ici, le but du jeu est de faire
exécuter le stty echo si l'utilisateur fait un ^C ou ^.
Avatar
Francois Lafont
Le 20/02/2012 13:25, Luc Habert a écrit :

#---------------------------
echo -n "Votre mot de passe : "
read
mdp="$REPLY"



Tu peux faire directement

echo -n "Votre mot de passe : "
read -r mdp

, et ça t'évite d'etre dépendant d'une basherie.



Oui en effet, merci pour la remarque.

En fait, j'utilisais REPLY pour vraiment conserver à 100% la saisie
exacte de l'utilisateur. En effet, avec ton code, si l'utilisateur
saisit ça " aaa " (des espaces, des a, puis des espaces), alors dans
la variable mdp les espaces de début et de fin ne sont pas conservés.
Mais dans le cas de la saisie d'un mot de passe, cette non-conservation
est souhaitable. Alors c'est parfait. :-)

Q1 : certes le mot de passe s'affiche, mais au delà de cet inconvénient,
la saisie qu'a faite l'utilisateur est-elle stockée quelque part dans un
fichier (une fois qu'il a fermé son terminal) ?



Éventuellement dans le swap. Si mdp est une variable d'environnement, et non
une simple variable de shell, elle sera visible des autres process du meme
utilisateur (cela dit, ils peuvent aussi taper directement dans la mémoire
de ton shell, mais c'est un peu plus difficille qu'un simple "ps e").



Ok, ça semble effectivement compliqué et pas à la portée du premier venu.

Merci pour ces précisions.


--
François Lafont
Avatar
YBM
Le 20.02.2012 13:29, Francois Lafont a écrit :
Le 20/02/2012 13:15, YBM a écrit :

Q1 : certes le mot de passe s'affiche, mais au delà de cet inconvénient,
la saisie qu'a faite l'utilisateur est-elle stockée quelque part dans un
fichier (une fois qu'il a fermé son terminal) ?



Je ne crois pas.



Ok.

Q2 : existe-t-il un moyen (simple si possible ;-)) en bash de faire un
script qui se comporte comme la commande passwd par exemple, dans le
sens où le mot de passe saisi par l'utilisateur ne s'affiche pas, tout
en étant bien sûr enregistré par le script ?



trap "stty echo" EXIT HUP INT QUIT
stty -echo
read mdp
stty echo
trap - EXIT HUP INT QUIT



Merci pour la réponse qui semble parfaitement fonctionner. Ça ne doit
pas être très compliqué, mais je ne connais pas du tout les deux
commandes trap et stty. Je vais me documenter.

Merci beaucoup YBM. :-)



de rien, et à l'instar de la remarque de Luc, je conseillerais de faire
un read -r mdp afin qu'un '' dans le mdp ne crée pas surprise.
Avatar
Francois Lafont
Le 20/02/2012 13:33, Luc Habert a écrit :

mais je ne connais pas du tout les deux commandes trap et stty.



stty fait le boulot de désactivation de l'echo de ce qui est tapé par
l'utilisateur (stty -echo) puis réactivation (stty echo).



Ok, je vois.

trap permet d'installer un signal handler. Ici, le but du jeu est de faire
exécuter le stty echo si l'utilisateur fait un ^C ou ^.



Heu, là je vois moins bien. Effectivement avec ça :

echo -n "Mot de passe : "
trap "stty echo" EXIT HUP INT QUIT
stty -echo
read -r mdp
stty echo
trap - EXIT HUP INT QUIT


a) si je tape CTRL+C au moment de la demande de mot de passe, je vois
s'afficher ^C.

b) si j'enlève les trap, alors quand je tape CTRL+C, le programme s'arrête.

C'est pas le cas b) qui est le plus logique en principe ?


--
François Lafont
Avatar
Luc.Habert.00__arjf
Francois Lafont :

En fait, j'utilisais REPLY pour vraiment conserver à 100% la saisie
exacte de l'utilisateur. En effet, avec ton code, si l'utilisateur
saisit ça " aaa " (des espaces, des a, puis des espaces), alors dans
la variable mdp les espaces de début et de fin ne sont pas conservés.



Ah flute alors. Mettre

OLDIFS=$IFS
IFS
avant, et

IFS=$OLDIFS

après pour qu'il ne s'amuse pas à trimmer.

Mais dans le cas de la saisie d'un mot de passe, cette non-conservation
est souhaitable.



Bah non, on peut très bien mettre un espace dans un passwd.
Avatar
Luc.Habert.00__arjf
Francois Lafont :

a) si je tape CTRL+C au moment de la demande de mot de passe, je vois
s'afficher ^C.

b) si j'enlève les trap, alors quand je tape CTRL+C, le programme s'arrête.

C'est pas le cas b) qui est le plus logique en principe ?



Le problème, c'est que l'état du terminal n'est pas restauré. Bon, en
pratique, il va l'etre parce que quand un shell interactif reprend la main,
il le fait aussi, mais ce n'est pas très propre de se reposer là-dessus.
Avatar
Francois Lafont
Le 20/02/2012 14:14, Luc Habert a écrit :

En fait, j'utilisais REPLY pour vraiment conserver à 100% la saisie
exacte de l'utilisateur. En effet, avec ton code, si l'utilisateur
saisit ça " aaa " (des espaces, des a, puis des espaces), alors dans
la variable mdp les espaces de début et de fin ne sont pas conservés.



Ah flute alors



Ben non pourquoi flûte, au contraire ?

. Mettre

OLDIFS=$IFS
IFS >
avant, et

IFS=$OLDIFS

après pour qu'il ne s'amuse pas à trimmer.

Mais dans le cas de la saisie d'un mot de passe, cette non-conservation
est souhaitable.



Bah non, on peut très bien mettre un espace dans un passwd.



Oui mais les espaces à l'intérieur du mot de passe eux sont bien
conservés avec « read -r mdp », pas de souci. Seuls les espaces du début
et de la fin sont enlevés. Moi, je trouve ça bien : mettre un espace à
l'intérieur de son mot de passe ok, mais mettre des espaces au début
et/ou à la fin de son mot de passe là franchement je trouve que ce n'est
pas très « catholique ». :-)


--
François Lafont
1 2