2014-12-04 109 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選項設置爲非空(例如,*顯示星號)來設置密碼輸入框。

相關問題