stdinからパスワードを読み取る


180

シナリオ:パスワードが必要な対話式のCLI Pythonプログラム。つまり、可能なGUIソリューションはありません。

bashでは、画面上で再度プロンプトを表示せずにパスワードを読み取ることができました

read -s

Pythonに似たものはありますか?つまり、

password = raw_input('Password: ', dont_print_statement_back_to_screen)

代替方法:入力した文字を画面に送信する前に「*」で置き換えます(別名ブラウザスタイル)。

回答:


280
>>> import getpass
>>> pw = getpass.getpass()

3
ええ、彼らはバッテリー。;-) Pythonの優れた点の1つは、他の言語、特にCのバイナリと簡単にバインドできるため、既存の多くの機能(getpass()など)を活用できることです
mjv

2
さらに良いことに、getpass()は、CLIツールがSTDINを介してデータを供給されているにもかかわらず、自分でパスワードを入力できるようにしたい状況を扱います。素晴らしいツール!
Tiemen 2013

2
@Tiemenですが、パスワードをスクリプトにパイプしたにもかかわらずgetpass()がプロンプトを表示し、パスワードを待機しているため、これを行うための解決策を探してここに来ました
Michael

1
私にとって、getpassはウィンドウをポップアップ表示し(私が欲しかったものでも、そのヘルプが言ったことでもありません)、パスワードを入力したときにパスワードを覆い隠しませんでした!再現するコード:インポートgetpass; getpass.getpass()
マイケルグレイズブルック

1
ただし、「*」は1つのタイプとして表示されません。どうすればこれを達成できますか?
Jason

53

はい、getpass「エコーせずにユーザーにパスワードの入力を求めます」

編集:私はまだこのモジュールで遊んでいなかったので、これは私が調理したものです(ただし、いたるところに同様のコードが見つかっても驚かないでしょう)。

import getpass

def login():
    user = input("Username [%s]: " % getpass.getuser())
    if not user:
        user = getpass.getuser()

    pprompt = lambda: (getpass.getpass(), getpass.getpass('Retype password: '))

    p1, p2 = pprompt()
    while p1 != p2:
        print('Passwords do not match. Try again')
        p1, p2 = pprompt()

    return user, p1

(これはPython 3.xです。Python2.xのraw_input代わりinputに使用してください。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.