Nach einem Passwort in einer POSIX-kompatiblen Shell fragen?

17

Wenn ich in einem bashSkript nach einem Passwort fragen möchte , mache ich Folgendes:

read -s

... aber wenn ich bashim POSIX-Modus mit starte, shwird die -sOption abgelehnt:

$ read -s
sh: 1: read: Illegal option -s

Wie fordere ich mit einem POSIX-kompatiblen Befehl sicher eine Eingabe an?

Elzo
quelle
1
Eine der möglichen Möglichkeiten wird in dieser Antwort auf SO beschrieben: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

Antworten:

24
read_password() {
  REPLY="$(
    # always read from the tty even when redirected:
    exec < /dev/tty || exit # || exit only needed for bash

    # save current tty settings:
    tty_settings=$(stty -g) || exit

    # schedule restore of the settings on exit of that subshell
    # or on receiving SIGINT or SIGTERM:
    trap 'stty "$tty_settings"' EXIT INT TERM

    # disable terminal local echo
    stty -echo || exit

    # prompt on tty
    printf "Password: " > /dev/tty

    # read password as one line, record exit status
    IFS= read -r password; ret=$?

    # display a newline to visually acknowledge the entered password
    echo > /dev/tty

    # return the password for $REPLY
    printf '%s\n' "$password"
    exit "$ret"
  )"
}

Beachten Sie, dass für Shells (mksh), in denen printfkein Kennwort erstellt wurde, das Kennwort in der psAusgabe (für einige Mikrosekunden) in Klartext angezeigt wird oder in einigen Überwachungsprotokollen angezeigt wird, wenn alle Befehlsaufrufe mit ihren Parametern überwacht werden.

Stéphane Chazelas
quelle
2
Könnte cat+ heredoc eine sicherere Alternative zu der sein printf?
John Kugelman unterstützt Monica
1
@JohnKugelman hier werden Dokumente in den meisten Shells als temporäre Dateien geschrieben, während printf in den meisten Shells erstellt wird. Ich bin mir nicht sicher, welches das Beste ist.
Stéphane Chazelas
Vielen Dank, dass Sie gezeigt haben, wie Sie die alten sttyEinstellungen speichern und wiederherstellen können.
Barmar
20

read -sist nicht in POSIX. Wenn Sie POSIX-konform sein möchten, verwenden Sie die stty -echo. sttyund dessen echoParameter werden in POSIX definiert.

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

Dies funktioniert auf allen Shells, die mit POSIX kompatibel sind.

Quelle

serenesat
quelle
7
einen Punkt aus der Antwort in @ arkadiusz-Drabczyk Kommentar zu markieren, wäre es eine gute Idee zu stoppen alle Signale , die Sie , um drehen können stty echoauf der Rückseite - für den Fall , werden der Benutzer verwirren und Hits Kontrolle-C während des read PASSWORDAbschnitts .
Jeff Schaller
Lies die verknüpfte Antwort oder sieh dir Stephanes Antwort in diesem Thread an
Jeff Schaller
Sie sollten das Echo nicht unbedingt einschalten, sondern die alte Einstellung speichern und wiederherstellen. Viele Leute arbeiten in Emacs-Shell-Puffern, und das Echo ist normalerweise deaktiviert, weil Emacs das Echo selbst ausführt. Die andere Antwort zeigt, wie das geht.
Barmar