Elixir 或 Erlang 使用隐藏输入提示输入密码
Elixir or Erlang prompt for password with hidden input
我正在用 elixir 编写 CLI,如何在不在终端中显示输入的情况下提示用户输入密码?
显然这有一些问题。目前最好的解决方案似乎是在循环中重复清除输入,如在 Hex 包管理器中实现的那样:
直接借用 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")
您可以使用 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()
returns 作为字符列表输入,因此您可能希望将其转换为二进制文件,如上所示。
我写了一个利用上述技术的包:https://hex.pm/packages/cowrie
我正在用 elixir 编写 CLI,如何在不在终端中显示输入的情况下提示用户输入密码?
显然这有一些问题。目前最好的解决方案似乎是在循环中重复清除输入,如在 Hex 包管理器中实现的那样:
直接借用 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")
您可以使用 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()
returns 作为字符列表输入,因此您可能希望将其转换为二进制文件,如上所示。
我写了一个利用上述技术的包:https://hex.pm/packages/cowrie