Bắt đầu nhập mật khẩu dòng lệnh trong Python


233

Bạn biết làm thế nào trong Linux khi bạn thử một số nội dung Sudo, nó bảo bạn nhập mật khẩu và khi bạn nhập, không có gì được hiển thị trong cửa sổ đầu cuối (mật khẩu không được hiển thị)?

Có cách nào để làm điều đó trong Python không? Tôi đang làm việc với một kịch bản đòi hỏi thông tin nhạy cảm và muốn ẩn nó khi tôi gõ nó.

Nói cách khác, tôi muốn lấy mật khẩu từ người dùng mà không hiển thị mật khẩu.

Câu trả lời:


297

Sử dụng getpass.getpass():

from getpass import getpass
password = getpass()

Một dấu nhắc tùy chọn có thể được thông qua như tham số; mặc định là "Password: ".

Lưu ý rằng chức năng này yêu cầu một thiết bị đầu cuối thích hợp, vì vậy nó có thể tắt tiếng vang của các ký tự đã nhập - xem phần Get GetPassWarning: Không thể kiểm soát tiếng vang trên thiết bị đầu cuối khi chạy từ IDLE để biết thêm chi tiết.


sẽ hoạt động, nhưng làm thế nào người ta có thể cẩn thận với một "hacker" sẽ tạo một bản sao của tập lệnh và sau đó nhận xét dòng yêu cầu mật khẩu người dùng?
asf107

129
@ asf107: Nếu tin tặc có thể chỉnh sửa mã nguồn, có những vấn đề khác cần phải lo lắng.
DSM

12
@ asf107 - Ý tưởng đằng sau việc yêu cầu mật khẩu là để bạn có thể chuyển nó đi để xác thực bằng thứ gì đó (IE, tôi đang sử dụng điều này để yêu cầu mật khẩu để xác thực với máy chủ trực tuyến). Nếu một hacker nhận xét đường dây, chương trình sẽ thất bại vì máy chủ sẽ không được xác thực nữa. Ý tưởng đằng sau việc sử dụng getpass()là để không ai có thể nhìn vào mã nguồn và tìm ra mật khẩu của bạn chỉ bằng cách đọc nó và không ai có thể lấy được mật khẩu của bạn chỉ bằng cách nhìn chằm chằm vào vai bạn và đọc mật khẩu của bạn khỏi màn hình khi bạn nhập nó vào.
ArtOfWarfare

158
import getpass

pswd = getpass.getpass('Password:')

getpass hoạt động trên Linux, Windows và Mac.


11
"Mật khẩu:" (có khoảng trắng sau dấu hai chấm) là dấu nhắc mặc định, do đó thường không cần chỉ định nó trong lệnh gọi getpass.getpass ().
JL

getpass là một mô-đun thư viện tiêu chuẩn đã có từ ít nhất Python 2.5
jocassid

1
điều này đã cho tôi một lỗi Warning (from warnings module): File "C:\Python27\lib\getpass.py", line 92 return fallback_getpass(prompt, stream) GetPassWarning: Can not control echo on the terminal. Warning: Password input may be echoed. trong IDLE, nhưng hoạt động tốt trong dấu nhắc lệnh, đã tìm thấy lý do ở đây
Oshada

getpass () Không hoạt động với IDLE. Có cách nào khác để đạt được điều này mà không có getpass () không?
Brendan

Để có lời nhắc trên stderr (bạn cũng sẽ cần import sys): getpass.getpass(<chuỗi>,sys.stderr)
Philip Kearns

26

Sử dụng getpass cho mục đích này.

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


Làm thế nào với tiếng vang * chars?
Nikhil VJ

12

Mã này sẽ in một dấu sao thay vì mỗi chữ cái.

import sys
import msvcrt

passwor = ''
while True:
    x = msvcrt.getch()
    if x == '\r':
        break
    sys.stdout.write('*')
    passwor +=x

print '\n'+passwor

7
đây chỉ là cửa sổ nhưng ít nhất nó không lặp lại getpasscâu trả lời. Tốt
Jean-François Fabre

3
sẽ không xử lý các khoảng trống.
Aykut Kllic

Tôi không chắc liệu mã của bạn có dành cho Python 2.x hay không, nhưng điều này không phù hợp với tôi. Tôi đang chạy Python 3.x. Lỗi đầu tiên tôi gặp là TypeError cho dòng 'passwor + = x'. Nó nói: "không thể chuyển đổi đối tượng byte thành str". Tôi đã thay đổi dòng để tôi rõ ràng chuyển x thành chuỗi, chẳng hạn như: "password + = str (x)". Nhưng mã vẫn không hoạt động. Khi tôi chạy nó, nó không nhắc tôi nhập liệu, nó chỉ in dấu hoa thị mãi mãi.
Larper

@Larper Nó dành cho Python 2, xem dòng cuối cùng của mã
MilkyWay90

0

15.7. getpass - Nhập mật khẩu di động

#!/usr/bin/python3
from getpass import getpass
passwd = getpass("password: ")
print(passwd)

Bạn có thể đọc thêm ở đây


13
Sự khác biệt giữa câu trả lời của bạn và những người khác là gì?
mechnicov

0

Cập nhật câu trả lời của @Ahmed ALaa

# import msvcrt
import getch

def getPass():
    passwor = ''
    while True:
        x = getch.getch()
        # x = msvcrt.getch().decode("utf-8")
        if x == '\r' or x == '\n':
            break
        print('*', end='', flush=True)
        passwor +=x
    return passwor

print("\nout=", getPass())

msvcrt chúng tôi chỉ dành cho windows, nhưng getch từ PyPI nên hoạt động cho cả hai (tôi chỉ thử nghiệm với linux). Bạn cũng có thể nhận xét / bỏ ghi chú hai dòng để làm cho nó hoạt động cho windows.

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.