Python:使用带有argparse的getpass

MHi*_*bin 10 python passwords arguments prompt

我环顾四周,但找不到任何东西.

基本上我想知道是否可以使用getpass.getpass()argparse.

目前我有以下作为解决方法,我只是想知道是否有更好的方法:

import argparse
import getpass

parser = argparse.ArgumentParser(description="Some description")
parser.add_argument('-p', metavar="password", default="foobarblah123", help="password for user (default to prompt user)")
...
parsed_args = parser.parse_args()
args = vars(parsed_args)
user_pass = args['p']
if user_pass == "foobarblah123":
  user_pass = getpass.getpass()
Run Code Online (Sandbox Code Playgroud)

我很确定这不是处理此问题的最佳方法,但是,需要为密码设置命令行选项...最佳实践与否.

谢谢.

Rar*_*ina 15

我想我可能找到了一个更好的方法来做到这一点.如何使用这样的自定义Action:

import argparse
import getpass

class PasswordPromptAction(argparse.Action):
    def __init__(self,
             option_strings,
             dest=None,
             nargs=0,
             default=None,
             required=False,
             type=None,
             metavar=None,
             help=None):
        super(PasswordPromptAction, self).__init__(
             option_strings=option_strings,
             dest=dest,
             nargs=nargs,
             default=default,
             required=required,
             metavar=metavar,
             type=type,
             help=help)

    def __call__(self, parser, args, values, option_string=None):
        password = getpass.getpass()
        setattr(args, self.dest, password)

parser.add_argument('-u', dest='user', type=str, required=True)
parser.add_argument('-p', dest='password', action=PasswordPromptAction, type=str, required=True)

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里不需要构造函数。尽管如此,这是一个很好的解决方案,谢谢! (2认同)

lwe*_*lna 8

环顾四周,没有找到足够的解决方案.这就是我想出的.

from argparse import ArgumentParser
from getpass import getpass

def main():
    parser = ArgumentParser(description="arg parser hidden password input.")
    parser.add_argument('-sp', '--secure_password', action='store_true', dest='password', 
                        help='hidden password prompt')
    args=parser.parse_args()

    if args.password:
        password = getpass()

    print(password)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

显然你想删除print(password),只是添加它来验证它的工作原理.


Gav*_*Roy 5

这是我想到的提示输入最小密码的内容(Python 3代码):

import argparse
import getpass


class Password:

    DEFAULT = 'Prompt if not specified'

    def __init__(self, value):
        if value == self.DEFAULT:
            value = getpass.getpass('LDAP Password: ')
        self.value = value

    def __str__(self):
        return self.value


parser = argparse.ArgumentParser(
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-u', '--username', help='Specify username',
    default=getpass.getuser())
parser.add_argument('-p', '--password', type=Password, help='Specify password',
    default=Password.DEFAULT)
args = parser.parse_args()

print(args.username, args.password)
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ python ~/Desktop/example.py -h
usage: example.py [-h] [-u USERNAME] [-p PASSWORD]

optional arguments:
  -h, --help            show this help message and exit
  -u USERNAME, --username USERNAME
                        Specify username (default: gavinr)
  -p PASSWORD, --password PASSWORD
                        Specify password (default: Prompt if not specified)

$ python ~/Desktop/example.py -p foo
gavinr foo

$ python ~/Desktop/example.py 
LDAP Password: 
gavinr foo
Run Code Online (Sandbox Code Playgroud)