Đọc mật khẩu từ stdin


180

Kịch bản: Một chương trình Python CLI tương tác, cần mật khẩu. Điều đó cũng có nghĩa là, không có giải pháp GUI nào khả thi.

Trong bash tôi có thể nhận được mật khẩu đọc mà không cần nhắc lại trên màn hình thông qua

read -s

Có cái gì đó tương tự cho Python? I E,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Thay thế: Thay thế các ký tự đã nhập bằng '*' trước khi gửi chúng trở lại màn hình (còn gọi là kiểu trình duyệt).

Câu trả lời:


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

3
Vâng, họ pin. ;-) Một trong những điều thú vị với Python là khả năng liên kết dễ dàng với các nhị phân trong ngôn ngữ khác, đặc biệt là C, do đó tận dụng rất nhiều thứ hiện có (như getpass (), tôi tin)
mjv

2
Thậm chí tốt hơn, getpass () xử lý tình huống trong đó công cụ CLI đang được cung cấp dữ liệu qua STDIN và bạn muốn có khả năng tự nhập mật khẩu. Công cụ tuyệt vời!
Tiemen

2
@Tiemen nhưng tôi đến đây để tìm giải pháp để thực hiện việc này vì getpass () vẫn nhắc tôi và chờ mật khẩu mặc dù tôi đã chuyển mật khẩu vào tập lệnh của mình
Michael

1
Đối với tôi, getpass xuất hiện một cửa sổ (không phải những gì tôi muốn, cũng không phải là sự giúp đỡ của nó) và không làm mờ mật khẩu khi tôi nhập nó vào! Mã để sao chép: nhập getpass; getpass.getpass ()
Michael Grazebrook

1
nhưng điều này không hiển thị '*' dưới dạng một loại. Làm thế nào để một người đạt được điều này?
Jason

53

Có , getpass: "Nhắc người dùng nhập mật khẩu mà không lặp lại."

Chỉnh sửa: Bản thân tôi chưa chơi với mô-đun này, vì vậy đây là thứ tôi vừa mới nấu (sẽ không ngạc nhiên nếu bạn tìm thấy mã tương tự ở khắp mọi nơi):

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

(Đây là Python 3.x; sử dụng raw_inputthay vì inputkhi sử dụng Python 2.x.)

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.