it-swarm.com.de

So erhalten Sie ein Kennwort aus einem Shell-Skript, ohne dass es wiederholt wird

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 Benutzerpasswort als Argument akzeptiert.

Ich möchte den Benutzer auffordern, sein Kennwort einzugeben, einer Shell-Variablen zuzuweisen und dann diese Variable zu verwenden, um die Befehlszeile des aufrufenden Programms zu erstellen (was natürlich eine Stream-Ausgabe erzeugt, die ich verarbeiten werde). 

Ich bin ein ziemlich kompetenter Shell-Programmierer in Bourne/Bash, weiß aber nicht, wie ich die Benutzereingaben akzeptieren kann, ohne dass sie an das Terminal gesendet werden (oder vielleicht mit '*' - Zeichen). 

Kann mir jemand helfen?

328
BD at Rivenhill

Hier ist eine andere Möglichkeit, dies zu tun:

#!/bin/bash
# Read Password
echo -n Password: 
read -s password
echo
# Run Command
echo $password

Der read -s schaltet das Echo für Sie aus. Ersetzen Sie einfach die Variable echo in der letzten Zeile durch den Befehl, den Sie ausführen möchten.

494
wsware
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
162
thecloud

Einzeiler: 

read -s -p "Password: " password

Unter Linux (und Cygwin) funktioniert dieses Formular in bash und sh. Es kann jedoch nicht Standard Unix sh sein.

Um weitere Informationen und Optionen zu erhalten, geben Sie in bash "help read" ein.

$ help read
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p Prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields.
  ...
  -p Prompt output the string Prompt without a trailing newline before
            attempting to read
  ...
  -s                do not echo input coming from a terminal
70
smendola

Die -s-Option von read 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 funktionieren würde, also schrieb ich eine kleine Funktion, die stty verwendet, um das Echo zu deaktivieren.

#!/bin/sh

# Read secret string
read_secret()
{
    # Disable echo.
    stty -echo

    # Set up trap to ensure echo is enabled before exiting if the script
    # is terminated while echo is disabled.
    trap 'stty echo' EXIT

    # Read secret.
    read "[email protected]"

    # Enable echo.
    stty echo
    trap - EXIT

    # Print a newline because the newline entered by the user after
    # entering the passcode is not echoed. This ensures that the
    # next line of output begins at a new line.
    echo
}

Diese Funktion verhält sich ähnlich wie der Befehl read. Hier folgt eine einfache Verwendung von read, gefolgt von einer ähnlichen Verwendung von read_secret. Die Eingabe in read_secret erscheint leer, da sie nicht an das Terminal gesendet wurde.

[[email protected] ~]$ read a b c
foo \bar baz \qux
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[[email protected] ~]$ unset a b c
[[email protected] ~]$ read_secret a b c

[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[[email protected] ~]$ unset a b c

Hier ist ein anderer, der die -r-Option verwendet, um die umgekehrten Schrägstriche in der Eingabe beizubehalten. Dies funktioniert, weil die oben definierte Funktion read_secret alle von ihr empfangenen Argumente an den Befehl read übergibt.

[[email protected] ~]$ read -r a b c
foo \bar baz \qux
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[[email protected] ~]$ unset a b c
[[email protected] ~]$ read_secret -r a b c

[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[[email protected] ~]$ unset a b c

Zum Schluß noch ein Beispiel, das zeigt, wie Sie mit der read_secret-Funktion ein Kennwort POSIX-kompatibel lesen.

printf "Password: "
read_secret password
# Do something with $password here ...
44
Susam Pal

Ich fand den Befehl askpass nützlich

password=$(/lib/cryptsetup/askpass "Give a password")

Jedes eingegebene Zeichen wird durch * ersetzt. Siehe: Geben Sie ein Passwort ein. ****

9
Manuel

Schalten Sie echo mit stty aus und danach wieder ein.

Sie können auch zur Eingabe eines Kennworts auffordern, ohne eine Variable in der aktuellen Shell festzulegen. Gehen Sie dazu folgendermaßen vor:

$(read -s;echo $REPLY)

Zum Beispiel:

my-command --set password=$(read -sp "Password: ";echo $REPLY)

Sie können mehrere dieser Eingabeaufforderungen mit Zeilenumbruch hinzufügen, indem Sie Folgendes tun:

my-command --set user=$(read -sp "`echo $'\n '`User: ";echo $REPLY) --set password=$(read -sp "`echo $'\n '`Password: ";echo $REPLY)
0
Pascal Chardon

Dieser Link hilft bei der Definition, * wie das Passwort von der Verwendung gelesen wird, ohne es an das Terminal zurückzugeben. * Wie jedes Zeichen durch ein * -Zeichen ersetzt wird.

https://www.tutorialkart.com/bash-Shell-scripting/bash-read-username-and-password/

0
Hassan Farid