Immer wieder habe ich die letzten Tage Bash-Skripte schreiben müssen, die ein Passwort benötigen (z.B. um eine LDAP-Abfrage durchzuführen). Jetzt kann man das Passwort natürlich ganz einfach direkt in das Skript schreiben, was allerdings weder schön noch besonders sicher ist. Denn wie schnell vergisst man, dass Passwort nach Benutzung wieder aus dem Skript zu entfernen. Jeder der dann Zugriff auf das Skript hat, kann auch das Passwort auslesen.
Die Lösung dieses Problems ist mehr als einfach. So kann ein Passwort einfach über read
ausgelesen werden. Ich habe mich allerdings einmal auf die Suche gemacht, da ich eine schöner Lösung wollte, die etwas mehr Funktionen bietet. So habe ich mir gewünscht, dass bei einer Eingabe des Nutzers nicht die Eingabe ausgeworfen wird, was ja wieder eine potentielle Sicherheitslücke darstellen würde, sondern ein Sternchen. Außerdem sollte es für den Nutzer möglich sein, einen Schritt zurückzugehen und die letzte bzw. die letzten Eingaben zu löschen. Fündig geworden bin ich ein einem Forumsbeitrag auf stackoverflow.com. Hier kommt die Funktion, die ich aus den Antworten abegeleitet habe:
password_request ()
{
echo Bitte das LDAP Passwort eingeben und die Eingabe mit [ENTER] beenden
unset PWD;
while IFS= read -r -s -n1 pass; do
[[ -z $pass ]] && { printf '\n'; break; }
if [[ $pass == $'\x7f' ]]; then # Wenn die Zurueck-Taste gedrueckt wird
# letztes Zeichen der Variabel wieder entfernen
[[ -n $PWD ]] && PWD=${PWD%?}
# Lösche letztes '*'
printf '\b \b'
else
printf '*'
PWD+=$pass
fi
done
BINDPW=$PWD
}
Die Funktion kann dann in dem selben Skript einfach über die Eingabe ihres Namens password_request
aufgerufen werden.