Como ler senhas em scripts bash de uma maneira como ferramentas que não estão sendo mostradas no terminal?
(Alterar a fonte para preto sobre preto pode ser complicado, fácil de copiar e colar - por isso não é solução)
Como ler senhas em scripts bash de uma maneira como ferramentas que não estão sendo mostradas no terminal?
(Alterar a fonte para preto sobre preto pode ser complicado, fácil de copiar e colar - por isso não é solução)
Respostas:
De help read
:
-s do not echo input coming from a terminal
man read
, ainda não fiz o check-in help read
. Bom saber.
man bash
e lá você pode encontrar opção -sSilent mode. If input is coming from a terminal, characters are not echoed.
Eu sempre stty -echo
desabilitava o eco, depois lia e depois o fazia stty echo
(leia mais vendo man of stty
- ie man stty
). Isso é mais útil do ponto de vista dos programadores, pois você pode desativar o eco e ler uma senha de uma linguagem de programação como Java, C (++), Python etc. com seus "leitores" padrão do stdin.
No bash, o uso pode ser assim:
echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd
Python, por exemplo, teria a seguinte aparência:
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)
Eu tive que fazer isso muitas vezes em Python, então eu sei muito bem dessa perspectiva. Isso não é muito difícil de traduzir para outros idiomas.
termios
,stty
,read -s
, tudo o que faz.