
Wie kann man Passwörter in Bash-Skripten so lesen, dass Tools sie auf einem Terminal nicht anzeigen?
(Das Ändern der Schriftart auf Schwarz auf Schwarz lässt sich leicht durch Kopieren und Einfügen umgehen, ist also keine Lösung.)
Antwort1
Aus help read
:
-s do not echo input coming from a terminal
Um beispielsweise den Benutzer aufzufordern und ein beliebiges Passwort in die Variable einzulesen passwd
,
IFS= read -s -p 'Password please: ' passwd
Antwort2
Ich habe immer stty -echo
das Echo ausgeschaltet, dann gelesen und danach ausgeführt stty echo
(lesen Sie mehr, indem Sie man of stty
- ie anzeigen man stty
). Dies ist aus der Sicht eines Programmierers nützlicher, da Sie das Echo ausschalten und dann ein Passwort aus einer Programmiersprache wie Java, C(++), Python usw. mit ihren Standard-Stdin-"Readern" lesen können.
In Bash könnte die Verwendung folgendermaßen aussehen:
echo -n "USERNAME: "; IFS= read -r uname
echo -n "PASSWORD: "; stty -echo; IFS= read -r passwd; stty echo; echo
program "$uname" "$passwd"
unset -v passwd # get rid of passwd
Python würde beispielsweise 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, also kenne ich es aus dieser Perspektive ziemlich gut. Es ist jedoch nicht sehr schwer, dies in andere Sprachen zu übersetzen.
Antwort3
Antwort4
Ihre Frage liest sich irgendwie anders: „In gewisser Weise wie Werkzeuge???“, daher weiß ich nicht genau, ob das hier für Sie funktioniert:
system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******