Elixir или Erlang запрашивают пароль со скрытым вводом

Я пишу CLI в эликсире, как я могу запросить у пользователя пароль, не отображая ввод в терминале?

1 ответ

Решение

Видимо, есть некоторые проблемы с этим. В настоящее время лучшим решением, по-видимому, является многократная очистка ввода в цикле, как это реализовано в менеджере пакетов Hex:

https://github.com/hexpm/hex/blob/1523f44e8966d77a2c71738629912ad59627b870/lib/mix/hex/utils.ex#L32-L58

Вы можете сделать это с помощью 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")
Другие вопросы по тегам