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.

Nacht
sumber

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.

Sven Marnach
sumber
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.

Nafskrip
sumber
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

RanRag
sumber
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
Ahmed ALaa
sumber
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

Dwi Wardana
sumber
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.

Mostafa Hassan
sumber