bash - putty window title command line




Wie man ein Passwort von einem Shell-Skript erhält, ohne es zu wiederholen (6)

Die Option -s 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 , 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 read . Hier ist eine einfache Verwendung von read gefolgt von ähnlicher Verwendung von read_secret . Die Eingabe von read_secret leer, weil sie nicht zum Terminal zurückgesendet 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 weiterer, der die Option -r , um die umgekehrten Schrägstriche in der Eingabe beizubehalten. Dies funktioniert, weil die read_secret definierte Funktion read_secret alle Argumente an den read_secret ü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

Schließlich ist hier ein Beispiel, das zeigt, wie die Funktion read_secret verwendet wird, um ein Passwort POSIX-konform zu lesen.

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

Ich habe ein Skript, das einen Prozess automatisiert, der Zugriff auf ein passwortgeschütztes System benötigt. Auf das System wird über ein Befehlszeilenprogramm zugegriffen, das das Benutzerpasswort als Argument akzeptiert.

Ich möchte den Benutzer auffordern, ihr Kennwort einzugeben, es einer Shellvariablen zuzuweisen und diese Variable dann zu verwenden, um die Befehlszeile des zugreifenden Programms zu erstellen (das natürlich Stromausgabe erzeugen wird, die ich verarbeiten werde).

Ich bin ein einigermaßen kompetenter Shell-Programmierer in Bourne / Bash, aber ich weiß nicht, wie ich die Benutzereingaben akzeptieren kann, ohne dass sie dem Terminal widersprechen (oder vielleicht, dass sie mit * -Zeichen wiedergegeben werden).

Kann mir jemand helfen?


Einzeiler:

read -s -p "Password: " password

Unter Linux (und Cygwin) funktioniert diese Form in bash und sh. Es kann jedoch nicht Standard-Unix sh sein.

Für weitere Informationen und Optionen, in bash, tippe "help read".

$ 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

Ich fand den askpass Befehl nützlich

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

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


Schalten Sie das echo mit stty und danach wieder ein.


#!/bin/bash
echo "please input password"
read -s pass 
clear
echo "password is: $pass"

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




sh