【发布时间】:2018-01-17 23:24:48
【问题描述】:
在处理密码时有没有办法回显“*”或其他字符?使用 STDIN.noecho 有效,但不提供任何用户反馈。 console.cr 只提供 raw 和 noecho。
谢谢。还在找……
【问题讨论】:
标签: crystal-lang
在处理密码时有没有办法回显“*”或其他字符?使用 STDIN.noecho 有效,但不提供任何用户反馈。 console.cr 只提供 raw 和 noecho。
谢谢。还在找……
【问题讨论】:
标签: crystal-lang
使用STDIN.noecho!,您走在正确的道路上。实际上,您需要做的是在原始模式下从STDIN 读取,并在每次按下键时回显*。然后你会听退格,这样你就可以将光标移回一个并用空格替换,然后当用户键入另一个字符时用 * 替换那个空格。您还需要检查 enter 和 Control+C 在终端捕获并以原始模式将其全部提供给您时被按下。
我基于用户 Alfe 在第二条评论中找到的 bash 实现 here。 更新:将代码更改为块内,希望能消除可能的终端问题。
# Fix for crystal bug
STDIN.blocking = true
# STDIN chars without buffering
STDIN.raw do
# Dont echo out to the terminal
STDIN.noecho do
final_password = ""
while char = STDIN.read_char
# If we have a backspace
if char == '\u{7f}'
# Move the cursor back 1 char
if final_password != ""
STDOUT << "\b \b"
STDOUT.flush
final_password = final_password[0...-1]
end
next
elsif char == '\r'
# Enter was pressed we're finished!
break
elsif char == '\u{3}'
# Control + C was pressed. Get outta here
Process.exit 0
elsif char.ascii_control?
# A Control + [] char was pressed. Not valid for a password
next
end
STDOUT << "*"
STDOUT.flush
final_password += char
end
puts final_password
end
end
# Resetting when finished
STDIN.blocking = false
如果这对您有帮助,请务必将其标记为已回答!
【讨论】:
STDIN.blocking = true 添加到此解决方案的顶部。
Enter password: ****[~]$ [~]$ [~]$ [~]$ [~]$ [~]$ [~]$ [~]$ [~]$