Get password from user in Fabric without repeating value

I use Fabric to automate deployment. In this process, I use the prompt function to request some input from the user. In particular, I need to request a password, and I would like to hide the value that the user enters, for example, using Python getpass . I would like to use prompt because of the processing of the key and validate arguments.

Is there a built-in Fabric method, or do I need to change the source of the prompts (eventually send a transfer request)?

+6
source share
1 answer

You might be able to use prompt_for_password in 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 

It looks like it turns out that the structure retrieves the password for ssh, then they set the env value using:

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

The key is easily replaced by installing env , but it looks like you might have to check yourself ...

+6
source

All Articles