2

我在 elixir 中编写 CLI,如何提示用户输入密码,而不在终端中显示输入?

4

3 回答 3

2

您可以使用 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

于 2020-07-02T02:40:52.583 回答
0

显然这有一些问题。目前最好的解决方案似乎是在循环中反复清除输入,如在 Hex 包管理器中实现的那样:

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

于 2016-06-09T09:21:59.653 回答
0

直接借用功能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")
于 2019-07-14T13:00:21.703 回答