2015-01-13 3 views
3

Я осмотрелся, но ничего не нашел.Python: Использование getpass with argparse

В основном мне было интересно, можно ли использовать 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() 

Я довольно уверен, что это не самый лучший способ справиться с этим, однако , есть требование иметь параметр командной строки для пароля ... наилучшая практика или нет.

Спасибо.

+0

Каждый другой инструмент командной строки, я использовал будет попросите пароль * отдельно *, если это необходимо, чтобы избежать этой проблемы. Откуда взялось это «требование»? – jonrsharpe

+0

Это для автоматизации, и ребята хотят иметь возможность запускать ее ad-hoc и автоматизировать ее. Имя пользователя/пароль используется для API другой системы, у которой есть собственный набор пользовательских разрешений, основанных на AD. Возможно, существует лучший способ разрешить оба варианта. – MHibbin

+1

Не удается ли автоматизировать его, даже если вы не поддерживаете его как аргумент командной строки? Ex. Они могут передать пароль в stdin. – Kevin

ответ

8

Я думаю, что я мог бы найти более удобный способ сделать это. Как насчет использования такого действия:

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() 
+1

Я не думаю, что здесь нужен конструктор. Несмотря на это, это отличное решение, спасибо! –

3

Осмотревшись и не найдя достаточного решения. Вот что я придумал.

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() 

Очевидно, что вы хотели бы удалить print(password), это просто добавляется, чтобы проверить это работает.

0

Вот что я придумал для запрашивая пароль, который довольно минимален (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) 

Использование:

$ 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 
Смежные вопросы