Отримання введення пароля командного рядка в Python


234

Ви знаєте, як в Linux, коли ви намагаєтеся щось із судо, він вказує вам ввести пароль, і під час введення нічого не відображається у вікні терміналу (пароль не відображається)?

Чи є спосіб це зробити в 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 - це стандартний бібліотечний модуль, який
існував

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, але добре працював у командному рядку, знайшов причину тут
Ошада,

getpass () Не працює з IDLE. Чи є інший спосіб досягти цього без getpass ()?
Брендан

Для того, щоб запит був на stderr (вам також знадобиться import sys): getpass.getpass(<string>,sys.stderr)
Philip Kearns

26

Для цього використовуйте getpass .

getpass.getpass - Попросіть користувача ввести пароль без повторення


як щодо відлуння * символів?
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. Добре
Жан-Франсуа Фабре

3
звичайно обробляти зворотні простори.
Айкут Клік

Я не впевнений, чи ваш код для Python 2.x, але це не працює для мене. Я запускаю Python 3.x. Перша помилка, яку я отримав - це TypeError для рядка 'passwor + = x'. У ньому було сказано: "не можна перетворити об'єкт байтів у str неявно". Я змінив рядок так, що я чітко передавав x на рядок, такий як: "password + = str (x)". Але код все одно не працює. Коли я запускаю його, це не запрошує мене на введення, воно просто надрукує зірочку назавжди.
Ларпер

@Larper Це для Python 2, дивіться останній рядок коду
MilkyWay90

0

15.7. getpass - Портативний введення пароля

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

Більше ви можете прочитати тут


13
Чим відрізняється ваша відповідь від інших?
мечников

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.