Hỏi mật khẩu trong vỏ tuân thủ POSIX?


17

Khi tôi muốn hỏi mật khẩu trong một bashtập lệnh, tôi làm điều đó:

read -s

... nhưng khi tôi chạy bashở chế độ POSIX, với sh, -stùy chọn bị từ chối:

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

Làm cách nào để tôi yêu cầu đầu vào một cách an toàn với lệnh tuân thủ POSIX?


1
Một trong những cách có thể được mô tả trong câu trả lời này trên SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabchot

Câu trả lời:


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

Lưu ý rằng đối với các shell (mksh) printfkhông được tích hợp sẵn, mật khẩu sẽ xuất hiện rõ ràng trong psđầu ra (trong vài micro giây) hoặc có thể hiển thị trong một số nhật ký kiểm toán nếu tất cả các lệnh gọi với tham số của chúng được kiểm tra.


2
Might cat+ heredoc có thể là sự thay thế an toàn hơn cho printf?
John Kugelman hỗ trợ Monica

1
@JohnKugelman ở đây tài liệu được viết dưới dạng tệp tạm thời trong hầu hết các shell trong khi printf được xây dựng trong hầu hết các shell. Tôi không chắc cái nào tốt nhất.
Stéphane Chazelas


Cảm ơn đã chỉ cho bạn cách lưu và khôi phục sttycài đặt cũ .
Barmar

20

read -skhông có trong POSIX. Nếu bạn muốn tuân thủ POSIX, hãy sử dụng stty -echo. sttyechotham số của nó được định nghĩa trong POSIX.

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

Điều này sẽ hoạt động trên tất cả các vỏ phù hợp với POSIX.

Nguồn


7
để làm nổi bật một điểm từ câu trả lời trong bình luận của @ arkadiusz-drabchot, bạn nên bẫy tất cả các tín hiệu bạn có thể để bật stty echolại - trong trường hợp người dùng bị nhầm lẫn và chạm control-C trong read PASSWORDphần này .
Jeff Schaller

đọc câu trả lời được liên kết hoặc xem câu trả lời của Stephane trong chủ đề này
Jeff Schaller

Bạn không nên bật tiếng vang vô điều kiện, bạn nên lưu và khôi phục cài đặt cũ. Nhiều người làm việc trong bộ đệm shell Emacs, và điều này thường bị vô hiệu hóa tiếng vang vì Emacs đang tự tạo tiếng vang. Câu trả lời khác cho thấy làm thế nào để làm điều này.
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.