การอ่านรหัสผ่านโดยไม่แสดงบนหน้าจอใน Bash Scripts


20

วิธีการอ่านรหัสผ่านในสคริปต์ทุบตีในลักษณะเช่นเครื่องมือที่ไม่แสดงใน terminal?

(การเปลี่ยนแบบอักษรเป็นสีดำบนพื้นสีดำอาจทำได้ยากโดยการคัดลอกและวางอย่างง่ายดายดังนั้นจึงไม่ใช่วิธีแก้ปัญหา)


3
สำหรับทุกคนที่อ่านข้อความนี้: อย่าอ่านรหัสผ่านด้วย echo on และ black-on-black รหัสผ่านยังคงถูกส่งและหากเทอร์มินัลไม่ทราบว่าคำสั่งเทอร์มินัลที่คุณใช้แล้วตัวละครจะสะท้อนออกมาอย่างชัดเจน ปิดเสียงสะท้อน การใช้งานtermios, stty, read -sสิ่งที่ไม่ได้
Alexios

นั่นเป็นเหตุผลที่ฉันเขียนว่าไม่ใช่วิธีแก้ปัญหา;)
Grzegorz Wierzowiecki

แน่นอน! บางครั้งผู้คนก็อ่านคำถามและได้ข้อสรุปที่เข้าใจผิด :)
Alexios

คำตอบ:


30

จากhelp read:

-s        do not echo input coming from a terminal

1
ยิ่งใหญ่ มันไม่ได้เขียนในของฉันฉันยังไม่ได้ตรวจสอบman read help readดีแล้วที่รู้.
Grzegorz Wierzowiecki

3
@GrzegorzWierzowiecki: คุณกำลังดูคู่มือผิด คุณต้องอ่านคู่มือของ bash ie man bashและคุณสามารถหาตัวเลือก -s ได้Silent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri

5

ฉันมักstty -echoจะปิดเสียงก้องจากนั้นอ่านและทำต่อไปstty echo(อ่านเพิ่มเติมโดยดูคนของstty- เช่นman stty) สิ่งนี้มีประโยชน์มากขึ้นจากมุมมองของโปรแกรมเมอร์ในขณะที่คุณสามารถปิดเสียงก้องแล้วอ่านรหัสผ่านจากภาษาการเขียนโปรแกรมเช่น Java, C (++), Python และอื่น ๆ ด้วย stdin มาตรฐานของพวกเขา

ในทุบตีการใช้งานอาจมีลักษณะเช่นนี้:

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd

ตัวอย่างเช่น Python จะมีลักษณะดังนี้:

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

ฉันต้องทำสิ่งนี้หลายครั้งใน Python ดังนั้นฉันรู้ว่ามันค่อนข้างดีจากมุมมองนั้น แม้ว่ามันจะไม่ยากมากนักในการแปลเป็นภาษาอื่น


-1

คำถามของคุณอ่าน "แตกต่างกันในลักษณะที่เป็นเครื่องมือ ???" ดังนั้นฉันไม่ทราบแน่ชัดว่าจะใช้กับคุณได้หรือไม่:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.