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)


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

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.


-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//?/*}"
******
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.