อ่านรหัสผ่านจาก stdin


180

สถานการณ์จำลอง: โปรแกรม CLI Python แบบโต้ตอบที่ต้องการรหัสผ่าน นั่นหมายความว่ายังไม่มีวิธีแก้ปัญหา GUI ที่เป็นไปได้

ในทุบตีฉันจะได้รับรหัสผ่านในการอ่านโดยไม่ต้องแจ้งให้มันบนหน้าจอผ่านทาง

read -s

Python มีบางอย่างที่คล้ายกันหรือไม่ กล่าวคือ

password = raw_input('Password: ', dont_print_statement_back_to_screen)

ทางเลือก: แทนที่อักขระที่พิมพ์ด้วย '*' ก่อนส่งกลับไปที่หน้าจอ (สไตล์ของเบราว์เซอร์ aka)

คำตอบ:


280
>>> import getpass
>>> pw = getpass.getpass()

3
ใช่พวกเขาแบตเตอรี่ ;-) หนึ่งในสิ่งดีๆกับงูหลามคือความสามารถในการผูกได้อย่างง่ายดายด้วยไบนารีในภาษาอื่น ๆ โดยเฉพาะ C จึงใช้ประโยชน์มากของสิ่งที่มีอยู่ (เช่น getpass () ผมเชื่อว่า)
MJV- สนาม

2
ดียิ่งขึ้น getpass () จัดการกับสถานการณ์ที่เครื่องมือ CLI กำลังป้อนข้อมูลผ่าน STDIN และคุณต้องการความสามารถในการพิมพ์รหัสผ่านด้วยตัวเอง เครื่องมือที่ยอดเยี่ยม!
Tiemen

2
@ Tiemen แต่ฉันมาที่นี่เพื่อหาทางออกให้ทำเพราะ getpass () ยังคงให้ฉันและรอรหัสผ่านแม้ว่าฉันจะส่งรหัสผ่านไปยังสคริปต์ของฉัน
Michael

1
สำหรับฉัน getpass เปิดหน้าต่างขึ้นมา (ไม่ใช่สิ่งที่ฉันต้องการหรือสิ่งที่มันช่วยบอก) และไม่ปิดบังรหัสผ่านเมื่อฉันพิมพ์ลงไป! รหัสที่จะทำซ้ำ: นำเข้า getpass; getpass.getpass ()
Michael Grazebrook

1
แต่จะไม่แสดง '*' เป็นประเภทเดียว เราจะบรรลุสิ่งนี้ได้อย่างไร?
เจสัน

53

ใช่, getpass : "พร้อมท์ให้ผู้ใช้ใส่รหัสผ่านโดยไม่สะท้อน"

แก้ไข:ฉันยังไม่ได้เล่นกับโมดูลนี้ด้วยตัวเองดังนั้นนี่คือสิ่งที่ฉันเพิ่งทำขึ้นมา (จะไม่แปลกใจถ้าคุณพบรหัสที่คล้ายกันทั่วสถานที่):

import getpass

def login():
    user = input("Username [%s]: " % getpass.getuser())
    if not user:
        user = getpass.getuser()

    pprompt = lambda: (getpass.getpass(), getpass.getpass('Retype password: '))

    p1, p2 = pprompt()
    while p1 != p2:
        print('Passwords do not match. Try again')
        p1, p2 = pprompt()

    return user, p1

(นี่คือ Python 3.x ใช้raw_inputแทนinputเมื่อใช้ Python 2.x)

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