2014-12-04 83 views
2

我正在构建一个工具是一个需要输入密码的命令。 我想用密码输入此命令时,命令行用“*”或“”替换每个字符,因此命令和密码将不可观察!,有没有办法停止显示字符?

是否有这样的命令,告诉TCL解释器“从这一点开始,将每个输入的字符显示为*”,然后切换回正常模式?

任何其他建议也是有价值的。

回答

2

在你的情况,你应采取“完全控制”在你的终端,并禁用其默认呼应行为(在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 
1

(假设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选项设置为非空(例如,*显示星号)来设置密码输入框。

相关问题