ถามรหัสผ่านในเชลล์ที่สอดคล้องกับ POSIX หรือไม่


17

เมื่อฉันต้องการขอรหัสผ่านในbashสคริปต์ฉันทำอย่างนั้น:

read -s

... แต่เมื่อผมทำงานbashในโหมด POSIX กับshที่-sตัวเลือกที่ถูกปฏิเสธ:

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

ฉันจะขออินพุตอย่างปลอดภัยด้วยคำสั่ง POSIX ได้อย่างไร


1
หนึ่งในวิธีที่เป็นไปได้อธิบายไว้ในคำตอบนี้บน SO: stackoverflow.com/a/28393320/3691891
Arkadiusz Drabczyk

คำตอบ:


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

โปรดทราบว่าสำหรับเชลล์เหล่านั้น (mksh) ที่printfไม่ได้สร้างขึ้นรหัสผ่านจะปรากฏอย่างชัดเจนในpsเอาต์พุต (สองสามไมโครวินาที) หรืออาจแสดงในบันทึกการตรวจสอบบางรายการหากมีการตรวจสอบคำสั่งทั้งหมดที่มีการตรวจสอบพารามิเตอร์


2
อาจcat+ heredoc เป็นทางเลือกที่ปลอดภัยกว่าการprintf?
John Kugelman สนับสนุน Monica

1
@JohnKugelman ที่นี่มีการเขียนเอกสารเป็นไฟล์ชั่วคราวในเชลล์ส่วนใหญ่ในขณะที่ printf สร้างขึ้นในเชลล์ส่วนใหญ่ ฉันไม่แน่ใจว่าอันไหนดีที่สุด
Stéphane Chazelas


ขอขอบคุณที่แสดงวิธีบันทึกและคืนค่าการsttyตั้งค่าเก่า
Barmar

20

read -sไม่ได้อยู่ใน POSIX ถ้าคุณต้องการให้ POSIX ใช้งานstty -echoได้ sttyและechoพารามิเตอร์ถูกกำหนดใน POSIX

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

สิ่งนี้จะทำงานกับเชลล์ทั้งหมดที่สอดคล้องกับ POSIX

แหล่ง


7
เพื่อเน้นจุดจากคำตอบในความคิดเห็นของ @ arkadiusz-drabczyk มันเป็นความคิดที่ดีที่จะดักจับสัญญาณทั้งหมดที่คุณสามารถทำได้เพื่อที่จะstty echoกลับมาเปิด- ในกรณีที่ผู้ใช้สับสนและกระทบกับ control-C ระหว่างread PASSWORDส่วน .
Jeff Schaller

อ่านคำตอบที่เชื่อมโยงหรือดูคำตอบของ Stephane ในหัวข้อนี้
Jeff Schaller

คุณไม่ควรเปิดเสียงก้องโดยไม่มีเงื่อนไขคุณควรบันทึกและกู้คืนการตั้งค่าเดิม หลายคนทำงานในบัฟเฟอร์ของ Emacs และสิ่งนี้มักจะปิดการใช้งานการสะท้อนเนื่องจาก Emacs กำลังทำเสียงสะท้อนเอง คำตอบอื่น ๆ แสดงวิธีการทำเช่นนี้
Barmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.