Python'da komut satırı şifre girişi alma


234

Linux'ta bazı Sudo şeylerini denediğinizde şifreyi girmenizi söyler ve yazarken terminal penceresinde hiçbir şey gösterilmez (şifre gösterilmez)?

Python'da bunu yapmanın bir yolu var mı? Çok hassas bilgi gerektiren ve yazarken gizli olmasını isteyen bir komut dosyası üzerinde çalışıyorum.

Başka bir deyişle, şifreyi göstermeden kullanıcıdan şifreyi almak istiyorum.

Yanıtlar:


298

Kullanım getpass.getpass():

from getpass import getpass
password = getpass()

İsteğe bağlı bir bilgi istemi parametre olarak iletilebilir; varsayılan değer "Password: ".

Bu işlevin uygun bir terminal gerektirdiğine dikkat edin, böylece yazılan karakterlerin yankılanmasını kapatabilir - daha fazla ayrıntı için IDLE'den çalıştırırken bkz. “GetPassWarning: terminaldeki yankı kontrol edilemiyor” .


çalışacak, ancak komut dosyasının bir kopyasını oluşturacak ve daha sonra kullanıcı şifresi gerektiren satırı yorumlayacak bir "hacker" a nasıl dikkat edilebilir?
asf107

129
@ asf107: Bilgisayar korsanı kaynak kodunu düzenleyebilirse, endişelenmeniz gereken başka sorunlar da var.
DSM

12
@ asf107 - Parola istemenin arkasındaki fikir, bir şeyle kimlik doğrulaması yapmak için geçebilmenizdir (IE, çevrimiçi bir sunucu ile kimlik doğrulaması için bir parola istemek için kullanıyorum). Bir bilgisayar korsanı satırı yorumladıysa, sunucu artık kimlik doğrulaması yapmayacağı için program başarısız olur. Kullanarak arkasındaki fikir getpass()kimsenin kaynak koduna bakmak ve sadece okuyarak şifrenizi öğrenmek ve kimse sadece omuz üzerinden bakarak ve bunu yazarken ekranın dışına şifrenizi okuyarak şifrenizi alabilirsiniz böylece olduğunu.
ArtOfWarfare

158
import getpass

pswd = getpass.getpass('Password:')

getpass Linux, Windows ve Mac üzerinde çalışır.


11
"Şifre:" (iki nokta üst üste işaretinden sonra bir boşluk ile) varsayılan bilgi istemidir, bu nedenle getpass.getpass () çağrısında genellikle belirtmeniz gerekmez.
JL

getpass, en azından Python 2.5'ten beri var olan standart bir kütüphane modülüdür
jocassid

1
bu bana 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'de

getpass () IDLE ile çalışmaz. Bunu getpass () olmadan başarmanın başka bir yolu var mı?
Brendan

Bilgi isteminin stderr'de olması gerekir (ayrıca ihtiyacınız olacak import sys): getpass.getpass(<string>,sys.stderr)
Philip Kearns

26

Bu amaçla getpass kullanın .

getpass.getpass - Kullanıcıdan yankısız bir şifre sor


yankılama * karakterlerine ne dersiniz?
Nikhil VJ

12

Bu kod her harf yerine bir yıldız işareti basacaktır.

import sys
import msvcrt

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

print '\n'+passwor

7
bu sadece pencereler ama en azından getpasscevabı tekrarlamıyor . İyi
Jean-François Fabre

3
arka boşlukları ele almayacak.
Aykut Kllic

Kodunuzun Python 2.x için olup olmadığından emin değilim, ama bu benim için çalışmıyor. Python 3.x kullanıyorum. Aldığım ilk hata 'passwor + = x' satırı için TypeError oldu. "Bayt nesnesi örtük olarak str'ye dönüştürülemiyor" dedi. Satırı, x gibi dizeye açıkça atacağım şekilde değiştirdim: "password + = str (x)". Ancak kod hala çalışmıyor. Çalıştırdığımda, girdi girmemi istemiyor, sadece yıldız işaretini sonsuza dek yazdırıyor.
Büyük

@Larper Python 2 içindir, kodun son satırına bakın
MilkyWay90

0

15.7. getpass - Taşınabilir şifre girişi

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

Daha fazlasını buradan okuyabilirsiniz


13
Cevabınız ve diğerleri arasındaki fark nedir?
mechnicov

0

@Ahmed ALaa'nın cevabı güncelleniyor

# 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())

sadece windows için msvcrt bize, ama PyPI getch her ikisi için de çalışmalıdır (Ben sadece linux ile test). Ayrıca, pencerelerde çalışmasını sağlamak için iki satırı yorumlayabilir / açıklamayı kaldırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.