Unix风格的密码readline

时间:2016-07-22 17:51:54

标签: crystal-lang

我理解如何从STDIN读取字符串(如下所示),但我的问题是字符显示在屏幕上。如何像Unix / Linux密码提示一样隐藏字符串?

print "Password: "
pass = gets.as(String).strip

1 个答案:

答案 0 :(得分:2)

标准库目前无法解决此问题。一个快速的解决方法是绑定getpass(3)

lib LibC
  fun getpass(prompt : Char*) : Char*
end

def getpass(prompt : String)
  password = LibC.getpass(prompt)
  raise Errno.new("getpass") unless password
  String.new(password)
end

password = getpass("Enter password: ")

但请注意,glibc不推荐使用此函数,应使用termios(3)接口。我为此打开了pull request,所以希望在Crystal版本0.19.0或更高版本中你能够:

print "Enter password: "
password = STDIN.noecho &.gets.try &.chomp
puts