Pythonでのコマンドラインパスワード入力の取得


234

LinuxでSudoを試してみると、パスワードを入力するように指示され、入力時にターミナルウィンドウに何も表示されません(パスワードは表示されません)。

Pythonでそれを行う方法はありますか?非常に機密性の高い情報を必要とするスクリプトを作成していて、入力時に非表示にしたいと考えています。

つまり、パスワードを表示せずにユーザーからパスワードを取得したいのです。

回答:


298

使用getpass.getpass()

from getpass import getpass
password = getpass()

オプションのプロンプトをパラメーターとして渡すことができます。デフォルトは"Password: "です。

この関数には適切な端末が必要なため、入力した文字のエコーをオフにできることに注意してください。詳細については、IDLEから実行するときに「GetPassWarning:端末のエコーを制御できません」を参照してください。


動作しますが、スクリプトのコピーを作成し、ユーザーパスワードが必要な行をコメント化する「ハッカー」に注意するにはどうすればよいでしょうか。
asf107

129
@ asf107:ハッカーがソースコードを編集できる場合、他に問題が心配されます。
DSM

12
@ asf107-パスワードを要求する背後にある考え方は、何かを認証するためにそれを渡すことができるようにすることです(つまり、オンラインサーバーで認証するためにパスワードを要求するためにこれを使用しています)。ハッカーがその行をコメント化した場合、サーバーはもはや認証されないため、プログラムは単に失敗します。使用しての背後にある考え方は、getpass()誰もがソースコードを見ていないし、それを読むことによって、あなたのパスワードを見つける、と誰もが自分の肩越しに見つめ、あなたはそれを入力すると画面からパスワードを読むことによって、あなたのパスワードを取得することはできませんすることができそうということです。
ArtOfWarfare 14

158
import getpass

pswd = getpass.getpass('Password:')

getpassはLinux、Windows、Macで動作します。


11
「パスワード:」(コロンの後にスペースを含む)がデフォルトのプロンプトであるため、getpass.getpass()の呼び出しで指定する必要がないことがよくあります。
JL

GETPASSは以来の周りされています標準ライブラリモジュールで、少なくともPythonの2.5
jocassid

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でエラーが発生しましたが、コマンドプロンプトで問題なく動作しました。理由はこちら
Oshada

getpass()IDLEでは機能しません。getpass()なしでこれを達成する別の方法はありますか?
ブレンダン

プロンプトを表示するには、stderrを使用します(次も必要ですimport sys):getpass.getpass(<string>,sys.stderr)
Philip Kearns

26

この目的でgetpassを使用します。

getpass.getpass-エコーせずにユーザーにパスワードの入力を求める


*文字をエコーするのはどうですか?
Nikhil VJ

12

このコードは、すべての文字の代わりにアスタリスクを印刷します。

import sys
import msvcrt

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

print '\n'+passwor

7
これはウィンドウのみですが、少なくともgetpass答えは繰り返されていません。良い
ジャンフランソワファーブル

3
バックスペースを処理しません。
Aykut Kllic

あなたのコードがPython 2.x用かどうかはわかりませんが、これは私にはうまくいきません。Python 3.xを実行しています。私が得た最初のエラーは 'passwor + = x'行のTypeErrorでした。「バイトオブジェクトを暗黙的にstrに変換することはできません」とありました。「password + = str(x)」のようにxを明示的に文字列にキャストするように行を変更しました。しかし、コードはまだ機能しません。実行すると、入力を求めるプロンプトは表示されず、アスタリスクが永久に出力されるだけです。
Larper 2018年

@Larper Python 2用です。コードの最後の行を参照してください
MilkyWay90

0

15.7。getpass —ポータブルパスワード入力

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

あなたはここでもっと読むことができます


13
あなたの答えと他の人の違いは何ですか?
mechnicov

0

@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 usはWindowsでのみ使用できますが、PyPIからのgetchは両方で機能するはずです(私はLinuxでのみテストしました)。2行をコメント/コメント解除して、ウィンドウで機能させることもできます。

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