Lire les mots de passe sans s'afficher à l'écran dans les scripts Bash

20

Comment lire les mots de passe dans les scripts bash d'une manière comme les outils qui ne le montrent pas sur le terminal?

(Changer la police en noir sur noir peut être difficile à copier et coller facilement - ce n'est donc pas une solution)

Grzegorz Wierzowiecki
la source
3
Pour tous ceux qui lisent ceci: ne lisez PAS les mots de passe avec écho activé et noir sur noir. Le mot de passe est toujours transmis, et si le terminal ne connaît pas les directives du terminal que vous avez utilisées, les caractères résonneront visiblement. Désactivez l'écho. Utilisez termios, stty, read -s, tout ce qu'il fait.
Alexios
C'est pourquoi j'ai écrit que ce n'est pas une solution;).
Grzegorz Wierzowiecki
En effet! Parfois, les gens survolent les questions et arrivent à des conclusions erronées. :)
Alexios

Réponses:

30

De help read:

-s        do not echo input coming from a terminal
Ignacio Vazquez-Abrams
la source
1
Génial. Ce n'est pas écrit dans mon man read, je n'ai pas vérifié help read. Bon à savoir.
Grzegorz Wierzowiecki
3
@GrzegorzWierzowiecki: Vous consultez le mauvais manuel. vous devez lire le manuel de bash ie man bashet là vous pouvez trouver l'option -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri
5

J'avais toujours l'habitude stty -echode désactiver l'écho, puis de lire et de faire ensuite stty echo(en savoir plus en regardant man of stty- ie man stty). Ceci est plus utile du point de vue des programmeurs car vous pouvez désactiver l'écho puis lire un mot de passe à partir d'un langage de programmation tel que Java, C (++), Python, etc. avec leurs "lecteurs" stdin standard.

En bash, l'utilisation pourrait ressembler à ceci:

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd

Python, par exemple, ressemblerait à:

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

J'ai dû le faire plusieurs fois en Python, donc je le sais assez bien de ce point de vue. Cependant, ce n'est pas très difficile à traduire dans d'autres langues.

Dylan
la source
-1

Votre question se lit un peu différemment "comme des outils ???" donc je ne sais pas exactement si cela fonctionnera pour vous:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
2bc
la source