Elixir或Erlang提示输入带有隐藏输入的密码

Elixir或Erlang提示输入带有隐藏输入的密码,erlang,command-line-interface,elixir,erlang-escript,Erlang,Command Line Interface,Elixir,Erlang Escript,我正在用elixir编写CLI,如何在不在终端中显示输入的情况下提示用户输入密码?显然这有一些问题。目前最好的解决方案似乎是重复清除循环中的输入,如十六进制软件包管理器中实现的: 显然,这方面存在一些问题。目前最好的解决方案似乎是重复清除循环中的输入,如十六进制软件包管理器中实现的: 只需直接从Mix.Tasks.Hex借用功能,编写如下代码 some_pass = Mix.Tasks.Hex.password_get("Password: ") |> String.repla

我正在用elixir编写CLI,如何在不在终端中显示输入的情况下提示用户输入密码?

显然这有一些问题。目前最好的解决方案似乎是重复清除循环中的输入,如十六进制软件包管理器中实现的:


显然,这方面存在一些问题。目前最好的解决方案似乎是重复清除循环中的输入,如十六进制软件包管理器中实现的:


只需直接从
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")

只需直接从
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()
以字符列表的形式返回输入,因此您可能需要将其转换为二进制,如上文所示


我编写了一个利用上述技术的包:

您可以使用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()
以字符列表的形式返回输入,因此您可能需要将其转换为二进制,如上文所示


我编写了一个利用上述技术的软件包:

足够公平。可能没有一种独立于平台的好方法可以通过虚拟机实现。您可能还可以使用OTP的
:io.get_password
,但我记得我无法让它正常工作。我认为这是一个类似的方法,很公平。可能没有一种独立于平台的好方法可以通过虚拟机实现。您可能还可以使用OTP的
:io.get_password
,但我记得我无法让它正常工作。我认为它遵循类似的方法。