2011-10-20 8 views
8

मैं विंडोज के तहत पायथन के साथ एक कंसोल प्रोग्राम लिख रहा हूं।
उपयोगकर्ता को अपना पासवर्ड इनपुट करते समय प्रोग्राम का उपयोग करने के लिए लॉग इन करने की आवश्यकता है, मैं चाहता हूं कि वे "*" के रूप में प्रतिबिंबित हों, जबकि मैं उपयोगकर्ता इनपुट प्राप्त कर सकता हूं।
मुझे मानक लाइब्रेरी में गेटपास नामक एक मॉड्यूल मिला, लेकिन जब आप इनपुट (लिनक्स जैसे) इनपुट करते हैं तो यह कुछ भी गूंज नहीं करेगा।
धन्यवाद।पायथन कंसोल प्रोग्राम में गूंज "*" के साथ पासवर्ड कैसे पढ़ा जाए?

उत्तर

7

getpass मॉड्यूल पायथन में लिखा गया है। आप इसे करने के लिए आसानी से इसे संशोधित कर सकते हैं। वास्तव में, यहाँ है कि आप बस अपने कोड में पेस्ट कर सकता है getpass.win_getpass() का एक संशोधित संस्करण है:

import sys 

def win_getpass(prompt='Password: ', stream=None): 
    """Prompt for password with echo off, using Windows getch().""" 
    import msvcrt 
    for c in prompt: 
     msvcrt.putch(c) 
    pw = "" 
    while 1: 
     c = msvcrt.getch() 
     if c == '\r' or c == '\n': 
      break 
     if c == '\003': 
      raise KeyboardInterrupt 
     if c == '\b': 
      pw = pw[:-1] 
      msvcrt.putch('\b') 
     else: 
      pw = pw + c 
      msvcrt.putch("*") 
    msvcrt.putch('\r') 
    msvcrt.putch('\n') 
    return pw 

आप इस पर पुनर्विचार करने हालांकि, चाहते हो सकता है। लिनक्स रास्ता बेहतर है; यहां तक ​​कि सिर्फ पासवर्ड में वर्णों की संख्या को जानना किसी को भी महत्वपूर्ण संकेत है जो इसे क्रैक करना चाहता है।

+0

msvcrt.putch ('\ b') ऐसा लगता है कि यह काम नहीं करता है – wong2

-1

You can use the getpass module. यह वास्तव में प्रश्न का उत्तर नहीं देता है क्योंकि गेटपास फ़ंक्शन कंसोल को कुछ भी आउटपुट नहीं देता है। इसका कारण यह है कि यह सुरक्षा की एक अतिरिक्त परत है। अगर कोई आपके कंधे पर देख रहा है, तो वे यह पता लगाने में सक्षम नहीं होंगे कि आपका पासवर्ड कितना समय है।

इसका इस्तेमाल इस तरह के एक उदाहरण है:

from getpass import getpass 
getpass('Enter your password: ') 

इस उदाहरण प्रदर्शित करेगा "अपना पासवर्ड दर्ज करें:" और फिर आप अपना पासवर्ड में टाइप कर सकते हैं।

+0

मूल प्रश्न में 'गेटपास' का उल्लेख किया गया था और अस्वीकार कर दिया गया क्योंकि यह तारों को प्रतिबिंबित नहीं करता है। – kindall

4

किंडल का जवाब करीब है, लेकिन इसमें बैकस्पेस के साथ समस्याएं हैं जो क्षुद्रग्रहों को मिटा नहीं रही हैं, साथ ही साथ बैकस्पेस इनपुट प्रॉम्प्ट से आगे जाने में सक्षम है।

प्रयास करें:

def win_getpass(prompt='Password: ', stream=None): 
    """Prompt for password with echo off, using Windows getch().""" 
    if sys.stdin is not sys.__stdin__: 
     return fallback_getpass(prompt, stream) 
    import msvcrt 
    for c in prompt: 
     msvcrt.putwch(c) 
    pw = "" 
    while 1: 
     c = msvcrt.getwch() 
     if c == '\r' or c == '\n': 
      break 
     if c == '\003': 
      raise KeyboardInterrupt 
     if c == '\b': 
      if pw == '': 
       pass 
      else: 
       pw = pw[:-1] 
       msvcrt.putwch('\b') 
       msvcrt.putwch(" ") 
       msvcrt.putwch('\b') 
     else: 
      pw = pw + c 
      msvcrt.putwch("*") 
    msvcrt.putwch('\r') 
    msvcrt.putwch('\n') 
    return pw 

नोट mscvrt.putwch अजगर 2.x के साथ काम नहीं करता है, आप के बजाय mscvrt.putch उपयोग करने के लिए की जरूरत है।

संबंधित मुद्दे