我正在構建一個工具是一個需要輸入密碼的命令。 我想用密碼輸入此命令時,命令行用「*」或「」替換每個字符,因此命令和密碼將不可觀察!,有沒有辦法停止顯示字符?
是否有這樣的命令,告訴TCL解釋器「從這一點開始,將每個輸入的字符顯示爲*」,然後切換回正常模式?
任何其他建議也是有價值的。
我正在構建一個工具是一個需要輸入密碼的命令。 我想用密碼輸入此命令時,命令行用「*」或「」替換每個字符,因此命令和密碼將不可觀察!,有沒有辦法停止顯示字符?
是否有這樣的命令,告訴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
選項設置爲非空(例如,*
顯示星號)來設置密碼輸入框。