पायथन में कमांड-लाइन पासवर्ड इनपुट प्राप्त करना


247

आपको पता है कि लिनक्स में कैसे आप कुछ सूडो सामान की कोशिश करते हैं, जो आपको पासवर्ड दर्ज करने के लिए कहता है और जैसा कि आप लिखते हैं, टर्मिनल विंडो में कुछ भी नहीं दिखाया गया है (पासवर्ड नहीं दिखाया गया है)?

क्या पायथन में ऐसा करने का कोई तरीका है? मैं एक ऐसी स्क्रिप्ट पर काम कर रहा हूं जिसके लिए इतनी संवेदनशील जानकारी की आवश्यकता है और जब मैं इसे टाइप कर रहा हूं, तो इसे छिपाया जाना चाहिए।

दूसरे शब्दों में, मैं पासवर्ड दिखाए बिना उपयोगकर्ता से पासवर्ड प्राप्त करना चाहता हूं।

जवाबों:


319

उपयोग करें getpass.getpass():

from getpass import getpass
password = getpass()

एक वैकल्पिक प्रॉम्प्ट को पैरामीटर के रूप में पारित किया जा सकता है; डिफ़ॉल्ट है "Password: "

ध्यान दें कि इस फ़ंक्शन के लिए एक उचित टर्मिनल की आवश्यकता होती है, इसलिए यह टाइप किए गए पात्रों की गूंज को बंद कर सकता है - आगे के विवरण के लिए IDLE से चलने पर "GetPassWarning: टर्मिनल पर गूंज को नियंत्रित नहीं कर सकता" देखें।


काम करेगा, लेकिन कोई "हैकर" से सावधान कैसे हो सकता है जो स्क्रिप्ट की एक प्रति बनाएगा और फिर उस लाइन पर टिप्पणी करेगा जिसमें पासवर्ड की आवश्यकता है?
22

136
@ asf107: यदि हैकर स्रोत कोड को संपादित कर सकता है, तो चिंता करने के लिए अन्य समस्याएं हैं।
DSM

12
@ asf107 - पासवर्ड के लिए अनुरोध करने के पीछे का विचार यह है कि आप इसे किसी चीज़ के साथ प्रमाणित करने के लिए पास कर सकते हैं (IE, मैं इसका उपयोग ऑनलाइन सर्वर से प्रमाणित करने के लिए पासवर्ड का अनुरोध करने के लिए कर रहा हूं)। यदि कोई हैकर लाइन से टिप्पणी करता है, तो प्रोग्राम केवल विफल हो जाएगा क्योंकि सर्वर अब और प्रमाणित नहीं होगा। उपयोग करने के पीछे विचार getpass()यह है कि कोई भी स्रोत कोड को नहीं देख सकता है और इसे पढ़कर ही अपना पासवर्ड पता कर सकता है, और कोई भी आपके कंधे को घूरकर और अपना पासवर्ड टाइप नहीं कर सकता है जब आप इसे टाइप करते हैं तो स्क्रीन से अपना पासवर्ड पढ़ सकते हैं।
ArtOfWarfare

161
import getpass

pswd = getpass.getpass('Password:')

getpass पर लिनक्स, विंडोज, मैक और काम करता है।


13
"पासवर्ड:" (बृहदान्त्र के बाद एक स्थान के साथ) डिफ़ॉल्ट प्रॉम्प्ट है, इसलिए कॉलपास करने के लिए इसे अक्सर निर्दिष्ट करने की आवश्यकता नहीं होती है।
JL

1
गेटपास एक मानक पुस्तकालय मॉड्यूल है जो कम से कम पायथन 2.5
जोकासीड

1
इससे मुझे 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 में एक त्रुटि मिली, लेकिन कमांड प्रॉम्प्ट में अच्छी तरह से काम किया, यहाँ
ओशाडा

getpass () IDLE के साथ काम नहीं करता है। क्या गेटपास के बिना इसे प्राप्त करने का एक और तरीका है ()?
ब्रेंडन

शीघ्र करने के लिए स्टैडर पर है (आपको भी आवश्यकता होगी import sys): getpass.getpass(<string>,sys.stderr)
फिलिप किर्न

26

इस उद्देश्य के लिए गेटपास का उपयोग करें ।

getpass.getpass - गूंज के बिना पासवर्ड के लिए उपयोगकर्ता को प्रेरित करें


कैसे के बारे में गूंज * आकर्षण के साथ?
निखिल वीजे

13

यह कोड हर अक्षर के बजाय एक तारांकन चिह्न प्रिंट करेगा।

import sys
import msvcrt

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

print '\n'+passwor

7
यह केवल विंडोज़ है, लेकिन कम से कम यह getpassउत्तर दोहरा नहीं रहा है । अच्छा
जीन फ़्राँस्वा Fabre

4
न तो बैकस्पेस को संभालेंगे।
बजे Aykut Kllic

मुझे यकीन नहीं है कि आपका कोड पायथन 2.x के लिए है, लेकिन यह मेरे लिए काम नहीं करता है। मैं पायथन 3.x चला रहा हूं। पहली त्रुटि जो मुझे मिली, वह थी 'passwor + = x' लाइन के लिए एक टाइपर। इसने कहा: "अव्यवस्थित रूप से str को बाइट ऑब्जेक्ट में नहीं बदल सकते"। मैंने लाइन को बदल दिया ताकि मैं स्पष्ट रूप से x को स्ट्रिंग में डाल दूं जैसे कि: "पासवर्ड + = str (x)"। लेकिन कोड अभी भी काम नहीं करता है। जब मैं इसे चलाता हूं, तो यह मुझे इनपुट के लिए प्रेरित नहीं करता है, यह सिर्फ तारांकन चिह्न को हमेशा के लिए प्रिंट करता है।
लार्पर

1
@Larper यह अजगर 2 के लिए है, कोड की अंतिम पंक्ति को देखने
MilkyWay90

@ MilkyWay90 इस कोड के लिए कुछ संशोधनों की आवश्यकता थी जो पायथन 3 के साथ संगत हो। एक संशोधित कोड एडिट प्रस्तुत किया है। आशा है कि यह स्वीकृत हो जाएगा :)
सागर

1

@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, लेकिन getch PyPI से (मैं केवल linux के साथ परीक्षण) दोनों के लिए काम करना चाहिए। आप इसे विंडो के लिए काम करने के लिए दो लाइनों पर टिप्पणी / अनलॉक्ड भी कर सकते हैं।


0

यहाँ मेरा कोड @Ahmed ALaa द्वारा प्रस्तुत कोड से आधारित है

विशेषताएं:

  • 64 अक्षरों तक के पासवर्ड के लिए काम करता है
  • बैकस्पेस इनपुट को स्वीकार करता है
  • आउटपुट *चरित्र (DEC: 42 ; HEX: 0x2A)इनपुट चरित्र के बजाय

दोष:

  • केवल विंडोज पर काम करता है

फ़ंक्शन जब कहा जाता है के secure_password_input()रूप में पासवर्ड देता है string। यह एक पासवर्ड प्रॉम्प्ट स्ट्रिंग को स्वीकार करता है , जो उपयोगकर्ता को पासवर्ड टाइप करने के लिए प्रदर्शित किया जाएगा

def secure_password_input(prompt=''):
    p_s = ''
    proxy_string = [' '] * 64
    while True:
        sys.stdout.write('\x0D' + prompt + ''.join(proxy_string))
        c = msvcrt.getch()
        if c == b'\r':
            break
        elif c == b'\x08':
            p_s = p_s[:-1]
            proxy_string[len(p_s)] = " "
        else:
            proxy_string[len(p_s)] = "*"
            p_s += c.decode()

    sys.stdout.write('\n')
    return p_s

-1

15.7। getpass - पोर्टेबल पासवर्ड इनपुट

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

आप यहां और पढ़ सकते हैं


16
आपके उत्तर और दूसरों के बीच क्या अंतर है?
mechnicov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.