【问题标题】:echo "*" for passwords input in crystal-langecho "*" 用于水晶语言中的密码输入
【发布时间】:2018-01-17 23:24:48
【问题描述】:

在处理密码时有没有办法回显“*”或其他字符?使用 STDIN.noecho 有效,但不提供任何用户反馈。 console.cr 只提供 raw 和 noecho。

谢谢。还在找……

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    使用STDIN.noecho!,您走在正确的道路上。实际上,您需要做的是在原始模式下从STDIN 读取,并在每次按下键时回显*。然后你会听退格,这样你就可以将光标移回一个并用空格替换,然后当用户键入另一个字符时用 * 替换那个空格。您还需要检查 enterControl+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
    

    如果这对您有帮助,请务必将其标记为已回答!

    【讨论】:

    • 这可行,但会使我的终端处于不稳定状态。重置终端并不能解决问题。你的回答让我如此接近。非常感谢您的洞察力。
    • 如果您指定了您正在做什么以及它如何破坏您的终端状态,那就太好了。 Check out this code snipped though 显然,这是为了不让该术语处于不可用状态。只需要移植到水晶哈哈
    • 我也只是看了一下,我想您可能遇到了this bug,解决方案是将STDIN.blocking = true 添加到此解决方案的顶部。
    • 我也发现并应用了建议的补丁。基本上,当代码终止时,我的终端不会回显任何击键,如果我只是按 Enter 键,我也不会得到换行符。终端 -reset 和 clear- 也无济于事。我必须关闭该终端并打开一个新终端。 Enter password: ****[~]$ [~]$ [~]$ [~]$ [~]$ [~]$ [~]$ [~]$ [~]$
    • noecho 和 raw 都可以与块一起使用...也许尝试将上面的代码放在 noecho 和 raw 块中? crystal-lang.org/api/0.23.1/IO/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多