Meminta kata sandi dalam shell yang mendukung POSIX?

17

Ketika saya ingin meminta kata sandi dalam sebuah bashskrip, saya melakukan itu:

read -s

... tetapi ketika saya menjalankan bashdalam mode POSIX, dengan sh, -sopsi ditolak:

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

Bagaimana saya secara aman meminta input dengan perintah yang sesuai dengan POSIX?

Elzo
sumber
1
Salah satu cara yang mungkin dijelaskan dalam jawaban ini pada SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

Jawaban:

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"
  )"
}

Perhatikan bahwa untuk cangkang (mksh) di mana printftidak dibangun, kata sandi akan muncul dengan jelas di psoutput (untuk beberapa mikrodetik) atau mungkin muncul di beberapa log audit jika semua perintah perintah dengan parameternya diaudit.

Stéphane Chazelas
sumber
2
Mungkinkah cat+ heredoc menjadi alternatif yang lebih aman printf?
John Kugelman mendukung Monica
1
@JohnKugelman di sini dokumen ditulis sebagai file sementara di sebagian besar shell sementara printf dibangun di sebagian besar shell. Saya tidak yakin mana yang terbaik.
Stéphane Chazelas
Terima kasih telah menunjukkan cara menyimpan dan mengembalikan sttypengaturan lama .
Barmar
20

read -stidak dalam POSIX. Jika Anda ingin menggunakan POSIX, gunakan perintah stty -echo. sttydan echoparameternya didefinisikan dalam POSIX.

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

Ini akan bekerja pada semua shell yang sesuai dengan POSIX.

Sumber

serenesat
sumber
7
untuk menyorot poin dari jawaban dalam komentar @ arkadiusz-drabczyk, itu akan menjadi ide yang bagus untuk menjebak semua sinyal yang Anda bisa untuk menghidupkan stty echokembali - jika pengguna menjadi bingung dan menekan control-C selama read PASSWORDbagian .
Jeff Schaller
baca jawaban yang tertaut atau lihat jawaban Stephane di utas ini
Jeff Schaller
Anda seharusnya tidak menghidupkan gema tanpa syarat, Anda harus menyimpan dan mengembalikan pengaturan yang lama. Banyak orang yang bekerja di buffer shell Emacs, dan ini biasanya menonaktifkan gema karena Emacs melakukan gema itu sendiri. Jawaban lain menunjukkan bagaimana melakukan ini.
Barmar