3

下面的代码片段提示输入用户和密码,默认为 env 变量。

现在,虽然密码输入在打字时被很好地隐藏了,但我还希望隐藏括号之间的默认值,到目前为止,如果我输入这个,密码默认值是明确的1234

➜  export PASSWORD=1234
➜  python test.py
➜  User [myuser]: you can see here
➜  Password [1234]: 
user you can see here
password you cant see


import os
import click

@click.command()
@click.option('--user', prompt=True, default=lambda: os.environ.get('USER', ''))
@click.option('--password', prompt=True, default=lambda: os.environ.get('PASSWORD', ''), hide_input=True)
def test(user, password):
    print('user {}'.format(user))
    print('password {}'.format(password))
    print(password)


if __name__ == '__main__':
    test()
4

2 回答 2

7

您可以创建一个字符串表示隐藏密码的类:

class HiddenPassword(object):
    def __init__(self, password=''):
        self.password = password
    def __str__(self):
        return '*' * len(self.password)

然后在您的代码中,您只需检查是否使用了此类并更新密码:

@click.command()
@click.option('--user',
              prompt=True,
              default=lambda: os.environ.get('USER', ''))
@click.option('--password',
              prompt=True,
              default=lambda: HiddenPassword(os.environ.get('PASSWORD', '')),
              hide_input=True)
def test(user, password):
    print('user: {}'.format(user))
    if isinstance(password, HiddenPassword):
        password = password.password
    print('password: {}'.format(password))

在行动:

$ PASSWORD=foobar python test.py
User [mVChr]:
Password [******]:
user: mVChr
password: foobar
$ PASSWORD=foobar python test.py
User [mVChr]: dan
Password [******]:
user: dan
password: user-entered-pw
于 2016-12-21T19:44:14.940 回答
3

找不到更好的解决方案,但也许可以。如果没有提供输入,您可以使用回调进行验证来检查输入值并将其替换为环境值。

def callback(ctx, param, value):
  if not value:
    return os.environ.get('PASSWORD', '')
  return value
...
@click.option('--password', prompt=True, callback=callback, default='', hide_input=True)
于 2016-12-21T19:38:07.590 回答