Pobieranie hasła wiersza polecenia w języku Python

234

Wiesz, jak w Linuksie, kiedy wypróbujesz niektóre rzeczy sudo, mówi ci, aby wprowadzić hasło i podczas pisania nic nie jest wyświetlane w oknie terminala (hasło nie jest pokazane)?

Czy jest na to sposób w Pythonie? Pracuję nad skryptem, który wymaga tak poufnych informacji i chciałbym, aby był on ukryty podczas pisania.

Innymi słowy, chcę uzyskać hasło od użytkownika bez pokazywania hasła.

Nacht
źródło

Odpowiedzi:

298

Użyj getpass.getpass():

from getpass import getpass
password = getpass()

Opcjonalne zapytanie można przekazać jako parametr; domyślnie jest to "Password: ".

Zauważ, że ta funkcja wymaga odpowiedniego terminala, aby mogła wyłączyć echo wpisywanych znaków - więcej informacji można znaleźć w „GetPassWarning: Nie można kontrolować echa na terminalu” podczas uruchamiania z IDLE .

Sven Marnach
źródło
zadziała, ale jak można uważać na „hakera”, który utworzy kopię skryptu, a następnie skomentuje wiersz wymagający hasła użytkownika?
asf107
129
@ asf107: Jeśli haker może edytować kod źródłowy, należy się martwić o inne problemy.
DSM
12
@ asf107 - Prośba o podanie hasła polega na tym, aby można było przekazać je w celu uwierzytelnienia przy pomocy czegoś (IE, używam tego do żądania hasła w celu uwierzytelnienia na serwerze online). Jeśli haker skomentuje linię, program po prostu zawiedzie, ponieważ serwer nie będzie już uwierzytelniany. Pomysł getpass()polega na tym, aby nikt nie mógł spojrzeć na kod źródłowy i znaleźć hasła po prostu czytając je, a nikt nie mógł uzyskać hasła po prostu patrząc przez ramię i czytając hasło poza ekranem podczas wpisywania.
ArtOfWarfare
158
import getpass

pswd = getpass.getpass('Password:')

getpass działa na systemach Linux, Windows i Mac.

Nafscript
źródło
11
„Hasło:” (ze spacją po dwukropku) jest domyślnym monitem, więc często nie trzeba go podawać w wywołaniu getpass.getpass ().
JL
getpass to standardowy moduł biblioteczny, który istnieje od co najmniej Pythona 2.5
jocassid
1
to dało mi błąd 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. w IDLE, ale działało dobrze w wierszu polecenia, znalazłem przyczynę tutaj
Oshada
getpass () Nie działa z IDLE. Czy istnieje inny sposób na osiągnięcie tego bez getpass ()?
Brendan
Aby otrzymać monit, należy kliknąć na stderr (będziesz również potrzebować import sys): getpass.getpass(<ciąg>,sys.stderr)
Philip Kearns
26

W tym celu użyj getpass .

getpass.getpass - Monituj użytkownika o hasło bez echa

RanRag
źródło
co powiesz na echo * znaków?
Nikhil VJ
12

Ten kod wyświetli gwiazdkę zamiast każdej litery.

import sys
import msvcrt

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

print '\n'+passwor
Ahmed ALaa
źródło
7
to tylko Windows, ale przynajmniej nie powtarza getpassodpowiedzi. Dobrze
Jean-François Fabre
3
nie obsługuje spacji.
Aykut Kllic,
Nie jestem pewien, czy twój kod jest dla Pythona 2.x, ale to nie działa dla mnie. Używam Python 3.x. Pierwszym błędem, jaki dostałem, był błąd typu „Błąd” dla wiersza „passwor + = x”. Napisano: „nie można przekonwertować obiektu bajtów na tekst niejawny”. Zmieniłem wiersz, aby jawnie rzucić x na ciąg znaków, np .: „hasło + = str (x)”. Ale kod nadal nie działa. Kiedy go uruchamiam, nie pyta mnie o dane wejściowe, po prostu drukuje gwiazdkę na zawsze.
Larper,
@ Larar To jest dla Pythona 2, patrz ostatnia linia kodu
MilkyWay90
0

15.7 getpass - Przenośne wprowadzanie hasła

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

Możesz przeczytać więcej tutaj

Dwi Wardana
źródło
13
Jaka jest różnica między twoją odpowiedzią a innymi?
mechnicov
0

Aktualizacja na odpowiedź @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 nas tylko dla Windows, ale getch z PyPI powinien działać dla obu (testowałem tylko z Linuksem). Możesz również skomentować / odkomentować dwie linie, aby działało w systemie Windows.

Mostafa Hassan
źródło