Baca kata sandi dari stdin

180

Skenario: Program CLI Python interaktif, yang membutuhkan kata sandi. Itu berarti juga, tidak ada solusi GUI yang mungkin.

Dalam bash saya bisa mendapatkan kata sandi dibaca tanpa diminta kembali di layar melalui

read -s

Apakah ada yang serupa dengan Python? Yaitu,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternatif: Ganti karakter yang diketik dengan '*' sebelum mengirim mereka kembali ke layar (gaya alias browser ').

Boldewyn
sumber

Jawaban:

280
>>> import getpass
>>> pw = getpass.getpass()
mjv
sumber
3
Ya, mereka baterai. ;-) Salah satu hal keren dengan Python adalah kemampuannya untuk mengikat dengan mudah dengan binari dalam bahasa lain, khususnya C, karenanya meningkatkan banyak hal yang ada (seperti getpass (), saya percaya)
mjv
2
Bahkan lebih baik, getpass () berurusan dengan situasi di mana alat CLI sedang memasukkan data melalui STDIN dan Anda ingin kemampuan mengetik kata sandi sendiri. Alat hebat!
Tiemen
2
@Tiemen, tetapi saya datang ke sini mencari solusi untuk melakukan ini karena getpass () masih mendorong saya dan menunggu kata sandi meskipun saya menyalurkan kata sandi ke skrip saya
Michael
1
Bagi saya, getpass membuka jendela (bukan apa yang saya inginkan, atau apa yang dikatakan bantuannya) dan tidak mengaburkan kata sandi ketika saya mengetiknya! Kode untuk direproduksi: import getpass; getpass.getpass ()
Michael Grazebrook
1
tetapi ini tidak menampilkan '*' sebagai satu jenis. Bagaimana seseorang mencapai ini?
Jason
53

Ya getpass,: "Meminta pengguna untuk kata sandi tanpa menggema."

Sunting: Saya belum pernah bermain dengan modul ini sendiri, jadi ini yang baru saja saya buat (tidak akan terkejut jika Anda menemukan kode yang sama di semua tempat):

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

(Ini adalah Python 3.x; gunakan raw_inputalih-alih inputsaat menggunakan Python 2.x.)

Stephan202
sumber