Elixir или Erlang запрашивают пароль со скрытым вводом
Я пишу CLI в эликсире, как я могу запросить у пользователя пароль, не отображая ввод в терминале?
1 ответ
Видимо, есть некоторые проблемы с этим. В настоящее время лучшим решением, по-видимому, является многократная очистка ввода в цикле, как это реализовано в менеджере пакетов Hex:
Вы можете сделать это с помощью Erlang :io.get_password()
функция, например
IO.write("What is your password?")
password = :io.get_password()
|> List.to_string()
Обратите внимание, что IO.write/1
предпочтительнее использовать Mix.shell().info()
для подсказки, потому что info
функция добавит новую строку, что обычно не то, что вы хотите в подсказке.
Также имейте в виду, что :io.get_password()
возвращает ввод в виде списка символов, поэтому вы, вероятно, захотите преобразовать его в двоичный файл, как показано выше.
Я написал пакет, в котором используется описанная выше техника: https://hex.pm/packages/cowrie
Просто позаимствуйте функциональность прямо у Mix.Tasks.Hex
, написав такой код, как следующий,
some_pass =
Mix.Tasks.Hex.password_get("Password: ")
|> String.replace_trailing("\n","")
И если вы запрашиваете пароль в задаче и не хотите, чтобы он запрашивался снова и снова, вы можете сохранить его в переменной среды, подобной этой,
:os.putenv(String.to_charlist("SECRET_PASSWORD"), String.to_charlist(some_pass))
И, конечно же, получить его с помощью:
System.get_env("SECRET_PASSWORD")