Lesen von Passwörtern ohne Anzeige auf dem Bildschirm in Bash-Skripten

20

Wie liest man Passwörter in Bash-Skripten wie Tools, die sie nicht auf dem Terminal anzeigen?

(Das Ändern der Schriftart in Schwarz auf Schwarz ist möglicherweise schwierig, da das Kopieren und Einfügen einfach ist - es ist also keine Lösung.)

Grzegorz Wierzowiecki
quelle
3
Für jeden, der dies liest: Lies KEINE Passwörter mit eingeschaltetem Echo und Schwarz-auf-Schwarz ein. Das Passwort wird weiterhin übertragen, und wenn das Terminal die von Ihnen verwendeten Terminalanweisungen nicht kennt, werden die Zeichen sichtbar wiedergegeben. Echo ausschalten. Verwenden Sie termios, stty, read -s, alles, was sie tut.
Alexios
Deshalb habe ich geschrieben, dass es keine Lösung ist;).
Grzegorz Wierzowiecki
Tatsächlich! Manchmal überfliegen die Leute Fragen und kommen zu fehlgeleiteten Schlussfolgerungen. :)
Alexios

Antworten:

30

Von help read:

-s        do not echo input coming from a terminal
Ignacio Vazquez-Abrams
quelle
1
Groß. Es steht nicht in meinem man read, ich habe nicht eingecheckt help read. Gut zu wissen.
Grzegorz Wierzowiecki
3
@GrzegorzWierzowiecki: Sie sehen das falsche Handbuch. Sie müssen das Handbuch von Bash dh lesen man bashund dort finden Sie -s OptionSilent mode. If input is coming from a terminal, characters are not echoed.
Pradeepchhetri
5

Ich habe immer das stty -echoEcho ausgeschaltet, dann gelesen und danach getan stty echo(lesen Sie mehr, indem Sie man von stty- ie sehen man stty). Dies ist aus Sicht des Programmierers nützlicher, da Sie das Echo deaktivieren und dann ein Kennwort aus einer Programmiersprache wie Java, C (++), Python usw. mit ihren Standard-Standard-"Lesegeräten" lesen können.

In Bash könnte die Verwendung so aussehen:

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

Python würde zum Beispiel so aussehen:

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)

Ich musste das oft in Python machen, deshalb kenne ich es aus dieser Perspektive ziemlich gut. Dies ist jedoch nicht sehr schwer in andere Sprachen zu übersetzen.

Dylan
quelle
-1

Ihre Frage lautet irgendwie anders "in einer Art und Weise wie Werkzeuge ???" Ich weiß also nicht genau, ob das für dich funktionieren wird:

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