2011-10-20 16 views
8

私は、Windowsの下でPythonでコンソールプログラムを書いています。
ユーザーがプログラムを使用するにはログインする必要があります。パスワードを入力するときに、ユーザーが入力できる内容を取得できる間に「*」と表示されたいと思います。
標準ライブラリでgetpassというモジュールが見つかりましたが、入力すると何も表示されません(linuxのようなものです)。
ありがとうございます。Pythonコンソールプログラムでecho "*"を使ってパスワードを読む方法は?

答えて

7

getpassモジュールはPythonで書かれています。これを行うには簡単に修正することができます。実際には、ここであなたは自分のコードに貼り付けることができ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 

あなたはしかし、これを再考する場合があります。 Linuxの方が優れています。パスワードの文字数を知っているだけでも、それを解読したい人にとっては重要なヒントです。

+0

msvcrt.putch( '\ b')これは動作しないようです – wong2

-1

You can use the getpass module. getpass関数はプロンプトを除いてコンソールに何も出力しないので、これは正確には答えられません。この理由は、それがセキュリティの余分な層だからです。誰かがあなたの肩を見守っていると、パスワードの長さを知ることができません。

は、ここでそれを使用する方法の例です:「パスワードを入力してください:」

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

この例では、表示され、その後、あなたはあなたのパスワードを入力することができます。

+0

'getpass'は元の質問で言及され、アスタリスクをエコーし​​ないので拒否されました。 – kindall

4

kindallの答えは近いですが、バックスペースに問題があり、バックスペースは入力プロンプトを超えて戻ることができるだけでなく、アスタリスクも消去しません。

試してみてください。

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は、Python 2.xのでは動作しません、あなたが代わりにmscvrt.putchを使用する必要があります。

関連する問題