Ich habe ein Skript, das einen Prozess automatisiert, der Zugriff auf ein kennwortgeschütztes System benötigt. Der Zugriff auf das System erfolgt über ein Befehlszeilenprogramm, das das Benutzerkennwort als Argument akzeptiert.
Ich möchte den Benutzer auffordern, sein Kennwort einzugeben, es einer Shell-Variablen zuzuweisen und diese Variable dann zum Erstellen der Befehlszeile des Zugriffsprogramms zu verwenden (das natürlich eine Stream-Ausgabe erzeugt, die ich verarbeiten werde).
Ich bin ein einigermaßen kompetenter Shell-Programmierer in Bourne / Bash, aber ich weiß nicht, wie ich die Benutzereingaben akzeptieren soll, ohne dass sie an das Terminal zurückgesendet werden (oder dass sie möglicherweise mit '*' Zeichen wiedergegeben werden).
Kann mir jemand dabei helfen?
read
das-r
Argument aus. Andernfalls können Backslashes verloren gehen. Keine der Antworten erwähnt dies. Die akzeptierte Antwort auf die doppelte Frage deckt diesen und einige weitere Randfälle ab. ZB Einstellung,IFS=
um nachfolgende Leerzeichen nicht zu verlieren.Antworten:
Hier ist eine andere Möglichkeit:
Das
read -s
wird das Echo für Sie ausschalten. Ersetzenecho
Sie einfach das in der letzten Zeile durch den Befehl, den Sie ausführen möchten.quelle
read
Befehl angeben :read -s -p "Password:" password
read -s
nicht in POSIX enthalten ist. Ihr Skript hängt von Bash ab, wenn Sie es verwenden. Wenn Sie POSIX-kompatibel sein möchten, sollten Sie stattdessen diestty -echo
unten vorgeschlagene Lösung verwenden, dastty
und derenecho
Parameter in POSIX definiert sind.echo -n
ist auch nicht in POSIX. Verwenden Sieprintf
stattdessen./bin/bash
und nicht mit/bin/sh
, nur um dies klar zu machen.echo "$REPLY" | sed -r 's/./*/g'
(oder sogar einer beliebigen Anzahl von Sternchen) anstelle eines leerenecho
, um sie wissen zu lassen, dass ihre Passworteingabe gesehen wurde (wenn sie eines eingegeben haben. Ich habe ein Standardkennwort, wenn sie die Eingabeaufforderung in meinem speziellen überspringen möchten Skript)Eine POSIX-konforme Antwort. Beachten Sie die Verwendung von
/bin/sh
anstelle von/bin/bash
. (Es funktioniert mit Bash, erfordert aber kein Bash.)quelle
stty
wenn Sie wollen POSIX - kompatibel sein. Der Code in dieser Antwort läuft perfekt, nicht einmal auf Bash, sondern auf allen Shells, die POSIX entsprechen.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Einzeiler:
Unter Linux (und Cygwin) funktioniert dieses Formular in Bash und Sh. Es kann jedoch sein, dass es sich nicht um Standard-Unix sh handelt.
Für weitere Informationen und Optionen geben Sie in bash "help read" ein.
quelle
Die
-s
Option vonread
ist im POSIX-Standard nicht definiert. Siehe http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Ich wollte etwas, das für jede POSIX-Shell funktioniert, also habe ich eine kleine Funktion geschrieben, mit derstty
das Echo deaktiviert wird.Diese Funktion verhält sich dem
read
Befehl ziemlich ähnlich . Hier ist eine einfache Verwendung vonread
gefolgt von einer ähnlichen Verwendung vonread_secret
. Die Eingaberead_secret
erscheint leer, da sie nicht an das Terminal zurückgegeben wurde.Hier ist eine andere, die die
-r
Option verwendet, um die Backslashes in der Eingabe beizubehalten. Dies funktioniert, weil dieread_secret
oben definierte Funktion alle empfangenen Argumente an denread
Befehl übergibt .Im Folgenden finden Sie ein Beispiel, das zeigt, wie Sie mit der
read_secret
Funktion ein Kennwort POSIX-kompatibel lesen können.quelle
oldtty = stty -g
und dann am Endestty $oldtty
, um die vorherigen Einstellungen wiederherzustellen. Ansonsten ist es toll.Ich fand den
askpass
Befehl nützlichJedes Eingabezeichen wird durch * ersetzt. Siehe: Geben Sie ein Passwort ****
quelle
/lib/cryptsetup/askpass
? Es ist sicherlich kein Standard * nix (oder GNU / Linux) Tool.sudo apt-get install cryptsetup
.Ctrl+C
das Terminal/lib/cryptsetup/askpass "Give a password" > pass.txt
Sehr nützlich, danke!Schalten
echo
Sie mitstty
aus und wieder ein.quelle
Sie können auch nach einem Kennwort fragen, ohne eine Variable in der aktuellen Shell festzulegen, indem Sie Folgendes tun:
Zum Beispiel:
Sie können mehrere dieser Eingabeaufforderungswerte mit Zeilenumbruch hinzufügen: Gehen Sie dazu folgendermaßen vor:
quelle
Wenn Sie zur Eingabe eines Kennworts aufgefordert werden, ist möglicherweise die Verwendung von encpass.sh von Interesse . Dies ist ein Skript, das ich zu ähnlichen Zwecken geschrieben habe, um ein Geheimnis zur Laufzeit zu erfassen und es dann für nachfolgende Gelegenheiten zu verschlüsseln. Nachfolgende Läufe fordern nicht zur Eingabe des Kennworts auf, da nur der verschlüsselte Wert von der Festplatte verwendet wird.
Die verschlüsselten Kennwörter werden in einem versteckten Ordner im Ausgangsverzeichnis des Benutzers oder in einem benutzerdefinierten Ordner gespeichert, den Sie über die Umgebungsvariable ENCPASS_HOME_DIR definieren können. Es ist POSIX-kompatibel und verfügt über eine MIT-Lizenz, sodass es auch in Unternehmensumgebungen verwendet werden kann. Meine Firma, Plyint LLC , verwaltet das Skript und veröffentlicht gelegentlich Updates. Pull-Anfragen sind ebenfalls willkommen, wenn Sie ein Problem finden. :) :)
Um es in Ihren Skripten zu verwenden, geben Sie einfach encpass.sh in Ihr Skript ein und rufen Sie die Funktion get_secret auf. Ich füge eine Kopie des Skripts unten bei, um die Sichtbarkeit zu erleichtern.
quelle
Dieser Link hilft beim Definieren von * Wie man ein Passwort von der Verwendung liest, ohne es an das Terminal zurückzusenden * Wie man jedes Zeichen durch * -Zeichen ersetzt.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
quelle
Wenn jemand ein Passwort in einer Datei speichern möchte, würde ich zunächst sicherstellen, dass es gehasht ist. Es ist nicht die beste Sicherheit, aber zumindest wird es nicht im Klartext sein.
Erstellen Sie zuerst das Passwort und hashen Sie es:
Erstellen Sie nun Ihr Programm, um den Hash zu verwenden. In diesem Fall empfängt dieses kleine Programm Benutzereingaben für ein Kennwort ohne Echo und konvertiert es dann in Hash, um es mit dem gespeicherten Hash zu vergleichen. Wenn es mit dem gespeicherten Hash übereinstimmt, wird der Zugriff gewährt:
quelle
\n
durch denecho
Befehl resultierende Zeilenumbruchzeichen vom Hashing fernzuhalten, indem Sieecho -n
stattdessen verwenden, da dies\n
nicht wirklich Teil des bereitgestellten Kennworts ist - natürlich sowohl für die Erstellung als auch für/tmp/secret
den Vergleich, der in Ihrem Beispiel folgt.