,有没有办法停止显示字符?
问题描述:
我正在构建一个工具是一个需要输入密码的命令。 我想用密码输入此命令时,命令行用“*”或“”替换每个字符,因此命令和密码将不可观察!,有没有办法停止显示字符?
是否有这样的命令,告诉TCL解释器“从这一点开始,将每个输入的字符显示为*”,然后切换回正常模式?
任何其他建议也是有价值的。
答
在你的情况,你应采取“完全控制”在你的终端,并禁用其默认呼应行为(在UNIX终端应进入所谓的原料模式喜欢) 然后,可以一个接一个读取字符(直到最大密码大小或按下Enter键)并且每个按下的字符都回显'*'。 你得到了工作代码示例在Unix和Windows如何这样做here 你可能想读也该链接echo-free password entry TCL wiki
proc enableRaw {{channel stdin}} {
exec /bin/stty raw -echo <@$channel
}
proc disableRaw {{channel stdin}} {
exec /bin/stty -raw echo <@$channel
}
enableRaw
set c [read stdin 1]
puts -nonewline $c
disableRaw
package require twapi
proc enableRaw {{channel stdin}} {
set console_handle [twapi::GetStdHandle -10]
set oldmode [twapi::GetConsoleMode $console_handle]
set newmode [expr {$oldmode & ~6}] ;# Turn off the echo and line-editing bits
twapi::SetConsoleMode $console_handle $newmode
}
proc disableRaw {{channel stdin}} {
set console_handle [twapi::GetStdHandle -10]
set oldmode [twapi::GetConsoleMode $console_handle]
set newmode [expr {$oldmode | 6}] ;# Turn on the echo and line-editing bits
twapi::SetConsoleMode $console_handle $newmode
}
enableRaw
set c [read stdin 1]
puts -nonewline $c
disableRaw
答
(假设Linux系统。)到目前为止处理密码的最简单的方法一个终端将关闭输入的回波,但以其他方式离开终端在烹饪模式。它不会为每个输入的字符显示*
,但这确实意味着您不必处理退格等事情(当用户意识到他们在输入返回之前错误地输入了最后几个字符)等。
exec /bin/stty -echo <@stdin
set password [gets stdin]
puts ""
exec /bin/stty echo <@stdin
如果你有Tcl的8.6,你可以很容易地使这此过程更加健壮:
proc getPassword {{prompt "Password: "}} {
exec /bin/stty -echo <@stdin
try {
puts -nonewline $prompt
flush stdout
return [gets stdin]
} finally {
puts ""
flush stdout
exec /bin/stty echo <@stdin
}
}
(这是可能的使用catch
和一些脚本来模拟try…finally
但它真的很烦人)
如果你有一个图形用户界面并且更喜欢这个功能,你可以将-show
选项设置为非空(例如,*
显示星号)来设置密码输入框。