Elixir或Erlang提示输入带有隐藏输入的密码
我正在用elixir编写CLI,如何在不在终端中显示输入的情况下提示用户输入密码?显然这有一些问题。目前最好的解决方案似乎是重复清除循环中的输入,如十六进制软件包管理器中实现的: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
显然,这方面存在一些问题。目前最好的解决方案似乎是重复清除循环中的输入,如十六进制软件包管理器中实现的:
只需直接从
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
,但我记得我无法让它正常工作。我认为它遵循类似的方法。