2012-11-01 12 views
6

Fabricを使用して配置を自動化しています。このプロセスでは、ユーザに何らかの入力を求めるためにprompt関数を使用します。特に私はパスワードを尋ねる必要があります。私は、Python getpassのように、ユーザが入力する値を隠したいと思います。 keyvalidate argsの処理のためにpromptを使用したいと思います。値をエコーし​​ないでFabricのユーザからパスワードを取得

ファブリックに組み込まれている方法がありますか、prompt source(最終的にプル要求を送信する)を変更する必要がありますか?

def set_password(password): 
    from fabric.state import env 
    env.password = env.passwords[env.host_string] = password 

キーは簡単です:

答えて

6

あなたはそれがこのようになりますfabric.network

def prompt_for_password(prompt=None, no_colon=False, stream=None): 
    """ 
    Prompts for and returns a new password if required; otherwise, returns 
    None. 

    A trailing colon is appended unless ``no_colon`` is True. 

    If the user supplies an empty password, the user will be re-prompted until 
    they enter a non-empty password. 

    ``prompt_for_password`` autogenerates the user prompt based on the current 
    host being connected to. To override this, specify a string value for 
    ``prompt``. 

    ``stream`` is the stream the prompt will be printed to; if not given, 
    defaults to ``sys.stderr``. 
    """ 
    from fabric.state import env 
    handle_prompt_abort("a connection or sudo password") 
    stream = stream or sys.stderr 
    # Construct prompt 
    default = "[%s] Login password for '%s'" % (env.host_string, env.user) 
    password_prompt = prompt if (prompt is not None) else default 
    if not no_colon: 
     password_prompt += ": " 
    # Get new password value 
    new_password = getpass.getpass(password_prompt, stream) 
    # Otherwise, loop until user gives us a non-empty password (to prevent 
    # returning the empty string, and to avoid unnecessary network overhead.) 
    while not new_password: 
     print("Sorry, you can't enter an empty password. Please try again.") 
     new_password = getpass.getpass(password_prompt, stream) 
    return new_password 

prompt_for_passwordを使用することができるかもしれませんが、ファブリックは、SSHのパスワードは、彼らはその後、使用してenvに設定し取得する方法ですenvを設定して交換可能ですが、あなた自身を検証する必要があるようです。

関連する問題