Mendapatkan input kata sandi baris perintah dengan Python


234

Anda tahu caranya di Linux ketika Anda mencoba beberapa hal Sudo yang memberitahu Anda untuk memasukkan kata sandi dan, saat Anda mengetik, tidak ada yang ditampilkan di jendela terminal (kata sandi tidak ditampilkan)?

Apakah ada cara untuk melakukan itu dengan Python? Saya sedang mengerjakan skrip yang membutuhkan informasi yang sangat sensitif dan ingin disembunyikan ketika saya mengetiknya.

Dengan kata lain, saya ingin mendapatkan kata sandi dari pengguna tanpa menunjukkan kata sandi.

Jawaban:


298

Gunakan getpass.getpass():

from getpass import getpass
password = getpass()

Prompt opsional dapat dikirimkan sebagai parameter; standarnya adalah "Password: ".

Perhatikan bahwa fungsi ini memerlukan terminal yang tepat, sehingga dapat mematikan gema dari karakter yang diketik - lihat “GetPassWarning: Tidak dapat mengontrol gema di terminal” saat menjalankan dari IDLE untuk perincian lebih lanjut.


akan berfungsi, tetapi bagaimana orang berhati-hati terhadap "peretas" yang akan membuat salinan skrip dan kemudian mengomentari baris yang memerlukan kata sandi pengguna?
asf107

129
@ asf107: Jika hacker dapat mengedit kode sumber, ada masalah lain yang perlu dikhawatirkan.
DSM

12
@ asf107 - Gagasan di balik meminta kata sandi adalah agar Anda dapat meneruskannya untuk mengotentikasi sesuatu (IE, saya menggunakan ini untuk meminta kata sandi untuk disahkan dengan server online). Jika seorang hacker berkomentar, program tersebut akan gagal karena server tidak akan diautentikasi lagi. Gagasan di balik penggunaan getpass()adalah agar tidak ada yang bisa melihat kode sumber dan mengetahui kata sandi Anda hanya dengan membacanya, dan tidak ada yang bisa mendapatkan kata sandi Anda hanya dengan menatap dari atas bahu Anda dan membaca kata sandi Anda dari layar ketika Anda mengetiknya.
ArtOfWarfare

158
import getpass

pswd = getpass.getpass('Password:')

getpass berfungsi di Linux, Windows, dan Mac.


11
"Kata sandi:" (dengan spasi setelah titik dua) adalah prompt default, jadi sering kali tidak perlu menentukannya dalam panggilan untuk getpass.getpass ().
JL

getpass adalah modul perpustakaan standar yang sudah ada sejak setidaknya Python 2.5
jocassid

1
ini memberi saya kesalahan 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. di IDLE, tetapi bekerja dengan baik di command prompt, menemukan alasannya di sini
Oshada

getpass () Tidak berfungsi dengan IDLE. Apakah ada cara lain untuk mencapai ini tanpa getpass ()?
Brendan

Untuk mendapatkan prompt ada di stderr (Anda juga perlu import sys): getpass.getpass(<string>,sys.stderr)
Philip Kearns

26

Gunakan getpass untuk tujuan ini.

getpass.getpass - Meminta pengguna untuk kata sandi tanpa menggema


bagaimana dengan echo * chars?
Nikhil VJ

12

Kode ini akan mencetak tanda bintang dan bukan setiap huruf.

import sys
import msvcrt

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

print '\n'+passwor

7
ini hanya windows tetapi setidaknya itu tidak mengulangi getpassjawabannya. Bagus
Jean-François Fabre

3
tidak akan menangani backspaces.
Aykut Kllic

Saya tidak yakin apakah kode Anda untuk Python 2.x, tetapi ini tidak berfungsi untuk saya. Saya menjalankan Python 3.x. Kesalahan pertama yang saya dapatkan adalah TypeError untuk baris 'passwor + = x'. Dikatakan: "tidak dapat mengkonversi objek byte ke str secara implisit". Saya mengubah baris sehingga saya secara eksplisit memasukkan x ke string seperti: "password + = str (x)". Namun kodenya masih tidak berfungsi. Ketika saya menjalankannya, itu tidak meminta saya untuk input, itu hanya mencetak tanda bintang selamanya.
Larper

@Larper Ini untuk Python 2, lihat baris terakhir kode
MilkyWay90

0

15.7. getpass - Input kata sandi portabel

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

Anda dapat membaca lebih lanjut di sini


13
Apa perbedaan antara jawaban Anda dan orang lain?
mechnicov

0

Memperbarui jawaban @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 kami hanya untuk windows, tapi getch dari PyPI harus bekerja untuk kedua (saya hanya diuji dengan linux). Anda juga dapat mengomentari / menghapus tanda komentar dua baris untuk membuatnya berfungsi untuk windows.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.