J'ai un script qui automatise un processus qui a besoin d'accéder à un système protégé par mot de passe. Le système est accessible via un programme en ligne de commande qui accepte le mot de passe utilisateur comme argument.
Je voudrais inviter l'utilisateur à taper son mot de passe, à l'assigner à une variable shell, puis à utiliser cette variable pour construire la ligne de commande du programme d'accès (qui va bien sûr produire une sortie de flux que je traiterai).
Je suis un programmeur shell raisonnablement compétent dans Bourne / Bash, mais je ne sais pas comment accepter l'entrée utilisateur sans l'avoir en écho sur le terminal (ou peut-être l'écho en utilisant des caractères '*').
Quelqu'un peut-il m'aider?
read
avec l'-r
argument lors de la lecture des mots de passe. Sinon, les barres obliques inverses peuvent être perdues. Aucune des réponses ne le mentionne. La réponse acceptée à la question en double couvre ce cas et quelques autres. Par exemple, réglageIFS=
afin de ne pas perdre les espaces de fuite.Réponses:
Voici une autre façon de procéder:
Le
read -s
désactivera l'écho pour vous. Remplacez simplement leecho
sur la dernière ligne par la commande que vous souhaitez exécuter.la source
read
commande:read -s -p "Password:" password
read -s
n'est pas dans POSIX, votre script dépend de bash si vous l'utilisez. Si vous souhaitez être conforme à POSIX, vous devez plutôt utiliser lastty -echo
solution suggérée ci-dessous, carstty
sesecho
paramètres sont définis dans POSIX.echo -n
n'est pas non plus dans POSIX. Utilisezprintf
plutôt./bin/bash
et pas avec/bin/sh
, juste pour que ce soit clair.echo "$REPLY" | sed -r 's/./*/g'
(ou même un nombre arbitraire d'astérisques) au lieu d'un videecho
pour leur faire savoir que leur entrée de mot de passe a été vue (s'ils en ont tapé un. J'ai un mot de passe par défaut s'ils choisissent d'ignorer l'invite en particulier) script)Une réponse conforme POSIX. Remarquez l'utilisation de
/bin/sh
au lieu de/bin/bash
. (Il fonctionne avec bash, mais il ne nécessite pas de bash.)la source
stty
si vous voulez être conforme aux spécifications POSIX. Le code de cette réponse fonctionne parfaitement même pas sur bash, mais en fait sur tous les shells conformes à POSIX.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Bon mot:
Sous Linux (et cygwin), ce formulaire fonctionne en bash et sh. Ce n'est peut-être pas le standard Unix sh.
Pour plus d'informations et d'options, dans bash, tapez "help read".
la source
L'
-s
option deread
n'est pas définie dans la norme POSIX. Voir http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Je voulais quelque chose qui fonctionnerait pour n'importe quel shell POSIX, j'ai donc écrit une petite fonction qui permetstty
de désactiver l'écho.Cette fonction se comporte de manière assez similaire à la
read
commande. Voici une utilisation simple deread
suivie d'une utilisation similaire deread_secret
. L'entrée àread_secret
apparaît vide car elle n'a pas été renvoyée au terminal.En voici un autre qui utilise l'
-r
option pour conserver les barres obliques inverses dans l'entrée. Cela fonctionne car laread_secret
fonction définie ci-dessus transmet tous les arguments qu'elle reçoit à laread
commande.Enfin, voici un exemple qui montre comment utiliser la
read_secret
fonction pour lire un mot de passe d'une manière compatible POSIX.la source
oldtty = stty -g
puis à la finstty $oldtty
pour restaurer les paramètres précédents. Sinon, c'est super.J'ai trouvé la
askpass
commande utileChaque caractère saisi est remplacé par *. Voir: Donner un mot de passe ****
la source
/lib/cryptsetup/askpass
? Ce n'est certainement pas un outil standard * nix (ou GNU / Linux).sudo apt-get install cryptsetup
.Ctrl+C
ça gâche le terminal/lib/cryptsetup/askpass "Give a password" > pass.txt
Très utile, merci!Désactivez
echo
avecstty
, puis rallumez- le après.la source
Vous pouvez également demander un mot de passe sans définir de variable dans le shell actuel en faisant quelque chose comme ceci:
Par exemple:
Vous pouvez ajouter plusieurs de ces valeurs demandées avec un saut de ligne, en procédant comme suit:
la source
Pour toute personne devant demander un mot de passe, vous pouvez être intéressé par l'utilisation de encpass.sh . Il s'agit d'un script que j'ai écrit à des fins similaires pour capturer un secret lors de l'exécution, puis le crypter pour les occasions suivantes. Les exécutions suivantes n'invitent pas à saisir le mot de passe car il utilisera simplement la valeur chiffrée du disque.
Il stocke les mots de passe chiffrés dans un dossier caché sous le répertoire personnel de l'utilisateur ou dans un dossier personnalisé que vous pouvez définir via la variable d'environnement ENCPASS_HOME_DIR. Il est conçu pour être compatible POSIX et possède une licence MIT, il peut donc être utilisé même dans les environnements d'entreprise. Mon entreprise, Plyint LLC , gère le script et publie parfois des mises à jour. Les demandes de tirage sont également les bienvenues si vous rencontrez un problème. :)
Pour l'utiliser dans vos scripts, sourcez simplement encpass.sh dans votre script et appelez la fonction get_secret. J'inclus une copie du script ci-dessous pour une visibilité facile.
la source
Ce lien aide à définir, * Comment lire le mot de passe à partir de son utilisation sans le renvoyer au terminal * Comment remplacer chaque caractère par * -caractère.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
la source
Tout d'abord, si quelqu'un veut stocker un mot de passe dans un fichier, je m'assurerais qu'il soit haché. Ce n'est pas la meilleure sécurité, mais au moins, ce ne sera pas en texte clair.
Créez d'abord le mot de passe et hachez-le:
Maintenant, créez votre programme pour utiliser le hachage. Dans ce cas, ce petit programme reçoit une entrée utilisateur pour un mot de passe sans écho, puis le convertit en hachage à comparer avec le hachage stocké. S'il correspond au hachage stocké, l'accès est accordé:
la source
\n
résultant de laecho
commande du hachage en utilisant à laecho -n
place, car il\n
ne fait pas vraiment partie du mot de passe fourni - bien sûr à la fois pour la création/tmp/secret
et la comparaison qui suit dans votre exemple.