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.

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 .


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.


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


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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.