POSIX uyumlu kabukta şifre istensin mi?


17

Bir bashkomut dosyasında parola sormak istediğimde bunu yaparım:

read -s

... ancak bashPOSIX modunda çalıştığımda sh, -sseçenek reddedildi:

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

POSIX uyumlu komutla bir girişi nasıl güvenli bir şekilde isteyebilirim?


1
Olası yollardan biri
SO'daki

Yanıtlar:


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

Yerleşik printfolmayan mermiler (mksh) için, parola psçıktıda (birkaç mikrosaniye için) net görünecek veya parametreleriyle birlikte tüm komut çağrıları denetlenirse bazı denetim günlüklerinde görünebilir.


2
Olabilir cat+ heredoc için daha güvenli bir alternatif olabilir printf?
John Kugelman,

1
@JohnKugelman burada printf çoğu kabukta yerleşikken dokümanlar çoğu kabukta geçici dosya olarak yazılır. Hangisinin en iyisi olduğundan emin değilim.
Stéphane Chazelas


Eski sttyayarların nasıl kaydedileceğini ve geri yükleneceğini gösterdiğiniz için teşekkür ederiz .
Barmar

20

read -sPOSIX'te değil. POSIX uyumlu olmak istiyorsanız stty -echo. sttyve echoparametresi POSIX'te tanımlanmıştır.

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

Bu, POSIX'e uyan tüm mermilerde çalışacaktır.

Kaynak


7
@ arkadiusz-drabczyk'un yorumundaki cevaptan bir noktayı vurgulamak için, çevirmek için yapabileceğiniz tüm sinyalleri yakalamak iyi bir fikir olacaktır. stty echo durumda kullanıcı karışır ve hit kontrol-C sırasında - geri read PASSWORDbölümünde .
Jeff Schaller

Bağlantılı yanıtı okuyun veya Stephane'ın bu konudaki cevabına bakın
Jeff Schaller

Koşulsuz olarak yankıyı açmamalısınız, eski ayarı kaydetmeli ve geri yüklemelisiniz. Birçok kişi Emacs kabuk tamponlarında çalışır ve Emacs yankılanmayı kendisi yaptığı için bu normalde yankılanmayı devre dışı bırakır. Diğer cevap, bunun nasıl yapılacağını gösterir.
Barmar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.