Lendo senhas sem mostrar na tela em Bash Scripts

20

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)

Grzegorz Wierzowiecki
fonte
3
Para quem estiver lendo isso: NÃO leia senhas com eco ativado e preto no preto. A senha ainda é transmitida e, se o terminal não souber as diretivas usadas, os caracteres ecoarão visivelmente. Desative o eco. Use termios, stty, read -s, tudo o que faz.
28412 Alexios
É por isso que escrevi, que não é uma solução;).
Grzegorz Wierzowiecki 26/03
De fato! Às vezes, as pessoas examinam as perguntas e chegam a conclusões equivocadas. :)
Alexios

Respostas:

30

De help read:

-s        do not echo input coming from a terminal
Ignacio Vazquez-Abrams
fonte
1
Ótimo. Não está escrito no meu man read, ainda não fiz o check-in help read. Bom saber.
Grzegorz Wierzowiecki 26/03
3
@GrzegorzWierzowiecki: Você está vendo o manual errado. você tem que ler o manual do bash ou seja, man bashe lá você pode encontrar opção -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri
5

Eu sempre stty -echodesabilitava 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.

Dylan
fonte
-1

Sua pergunta é um pouco diferente "de certa forma como ferramentas ???" então não sei exatamente se isso funcionará para você:

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