รับอินพุตรหัสผ่านบรรทัดคำสั่งใน Python


234

คุณรู้วิธีใน Linux เมื่อคุณลองใช้ Sudo บางอย่างมันบอกให้คุณป้อนรหัสผ่านและในขณะที่คุณพิมพ์ไม่มีอะไรปรากฏในหน้าต่างเทอร์มินัล (รหัสผ่านไม่แสดง)

มีวิธีการทำเช่นนั้นใน Python หรือไม่? ฉันกำลังทำงานกับสคริปต์ที่ต้องการข้อมูลที่ละเอียดอ่อนมากและต้องการให้ซ่อนไว้เมื่อฉันพิมพ์

กล่าวอีกนัยหนึ่งฉันต้องการรับรหัสผ่านจากผู้ใช้โดยไม่แสดงรหัสผ่าน

คำตอบ:


298

การใช้getpass.getpass():

from getpass import getpass
password = getpass()

พรอมต์เสริมสามารถส่งผ่านเป็นพารามิเตอร์ "Password: "เริ่มต้นคือ

โปรดทราบว่าฟังก์ชั่นนี้ต้องการเทอร์มินัลที่เหมาะสมเพื่อให้สามารถปิดการสะท้อนของตัวอักษรที่พิมพ์ - ดู“ GetPassWarning: ไม่สามารถควบคุมเสียงสะท้อนบนเทอร์มินัล” เมื่อเรียกใช้จาก IDLEสำหรับรายละเอียดเพิ่มเติม


จะทำงานได้ แต่เราจะระวัง "แฮ็กเกอร์" ที่จะทำสำเนาของสคริปต์แล้วจึงออกความคิดเห็นในบรรทัดที่ต้องใช้รหัสผ่านของผู้ใช้ได้อย่างไร
asf107

129
@ asf107: หากแฮ็กเกอร์สามารถแก้ไขซอร์สโค้ดมีปัญหาอื่น ๆ ที่ต้องกังวล
DSM

12
@ asf107 - แนวคิดที่อยู่เบื้องหลังการขอรหัสผ่านคือเพื่อให้คุณสามารถส่งต่อเพื่อรับรองความถูกต้องกับบางสิ่ง (IE ฉันใช้สิ่งนี้เพื่อขอรหัสผ่านเพื่อรับรองความถูกต้องกับเซิร์ฟเวอร์ออนไลน์) หากแฮ็กเกอร์แสดงความคิดเห็นในบรรทัดโปรแกรมก็จะล้มเหลวเพราะเซิร์ฟเวอร์จะไม่ได้รับการตรวจสอบความถูกต้องอีกต่อไป คิดที่อยู่เบื้องหลังใช้getpass()เป็นจึงไม่มีใครที่สามารถดูรหัสแหล่งที่มาและหารหัสผ่านของคุณเพียงแค่อ่านมันและไม่มีใครจะได้รับรหัสผ่านของคุณโดยเพียงแค่จ้องมองข้ามไหล่ของคุณและการอ่านรหัสผ่านของคุณปิดหน้าจอเมื่อคุณพิมพ์ใน.
ArtOfWarfare

158
import getpass

pswd = getpass.getpass('Password:')

getpassทำงานบน Linux, Windows และ Mac


11
"รหัสผ่าน:" (พร้อมช่องว่างหลังโคลอน) เป็นพรอมต์เริ่มต้นดังนั้นจึงไม่จำเป็นต้องระบุในการเรียกไปยัง getpass.getpass ()
JL

getpass เป็นโมดูลไลบรารีมาตรฐานที่มีมาตั้งแต่ Python อย่างน้อย 2.5
jocassid

1
สิ่งนี้ทำให้ฉันมีข้อผิดพลาด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. ใน IDLE แต่ทำงานได้ดีในพรอมต์คำสั่งพบว่าสาเหตุที่นี่
347

getpass () ไม่ทำงานกับ IDLE มีวิธีอื่นในการทำสิ่งนี้โดยไม่มี getpass () หรือไม่?
เบรนแดน

หากต้องการให้พรอมต์อยู่บน stderr (คุณจะต้องใช้ด้วยimport sys): getpass.getpass(<string>,sys.stderr)
Philip Kearns

26

ใช้getpassเพื่อจุดประสงค์นี้

getpass.getpass - ให้ผู้ใช้ใส่รหัสผ่านโดยไม่ต้องสะท้อน


แล้ว echoing * chars ล่ะ?
Nikhil VJ

12

รหัสนี้จะพิมพ์เครื่องหมายดอกจันแทนตัวอักษรทุกตัว

import sys
import msvcrt

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

print '\n'+passwor

7
นี่เป็นหน้าต่างเท่านั้น แต่อย่างน้อยก็ไม่ได้ทำgetpassคำตอบซ้ำ ดี
Jean-François Fabre

3
จะไม่จัดการ backspaces
Aykut Kllic

ฉันไม่แน่ใจว่ารหัสของคุณสำหรับ Python 2.x หรือไม่ แต่มันไม่ได้ผลสำหรับฉัน ฉันกำลังใช้ Python 3.x ข้อผิดพลาดแรกที่ฉันได้รับคือ TypeError สำหรับบรรทัด 'passwor + = x' มันกล่าวว่า: "ไม่สามารถแปลงวัตถุเป็นไบต์โดยนัย" ฉันเปลี่ยนบรรทัดเพื่อให้ฉันแปลง x เป็นสตริงอย่างชัดเจนเช่น: "password + = str (x)" แต่รหัสยังคงไม่ทำงาน เมื่อฉันเรียกใช้มันไม่ได้แจ้งให้ฉันป้อนเพียงพิมพ์ดอกจันตลอดไป
Larper

@Larper สำหรับ Python 2 ดูบรรทัดสุดท้ายของรหัส
MilkyWay90

0

15.7 getpass - การป้อนรหัสผ่านแบบพกพา

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

คุณสามารถอ่านเพิ่มเติมได้ที่นี่


13
อะไรคือความแตกต่างระหว่างคำตอบของคุณกับคนอื่น ๆ ?
mechnicov

0

การอัปเดตคำตอบของ @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 เราสำหรับ windows เท่านั้น แต่getchจาก PyPI ควรใช้ได้ทั้งคู่ (ฉันทดสอบกับ linux เท่านั้น) นอกจากนี้คุณยังสามารถแสดงความคิดเห็น / ไม่ใส่เครื่องหมายข้อคิดเห็นทั้งสองบรรทัดเพื่อให้ทำงานได้กับ windows

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