shell指令碼可以使用read -s來預設禁止回顯輸入字元,這樣做一定程度上可以保證安全性。但這並不是乙個好的互動,因為對於輸入密碼並不能知道已經輸入了多少個字元。而使用*(星號)來代替輸入的字元是乙個很不錯的想法,即保證安全又有好的互動性。
程式的實現
首先要實現不顯示輸入字元,這個可以使用命令stty來實現
stty cbreak -echo
dd if=/dev/tty bs=1 count=1
2>/dev/null
stty -cbreak echo
執行上面的命令(放在指令碼中),可以發現輸入乙個字元並不會在螢幕上顯示出來,這是因為stty -echo
會禁止回顯,而dd if=/dev/tty bs=1 count=1 2>/dev/null
則是獲取剛剛輸入的字元,如果將上面的命令放在$()中執行,並將其賦值給變數,列印會發現就是剛剛輸入的字元。
由於上面的命令只是接收乙個字元,要多個字元的話需要使用while語句來實現,然後通過判斷輸入的字元是否為回車鍵來實現結束輸入。
while : ;do
char=`
stty cbreak -echo
dd if=/dev/tty bs=1 count=1 2>/dev/null
stty -cbreak echo
`if [ "$char" = "" ];then
break
fipassword="$password$char"
done
然後我們來實現輸出為星號。這個很簡單,上面的程式在整個過程中不會輸出任何字元,要實現輸出只需要在每次while迴圈的結束輸出乙個*即可。
while : ;do
char=`
stty cbreak -echo
dd if=/dev/tty bs=1 count=1 2>/dev/null
stty -cbreak echo
`if [ "$char" = "" ];then
break
fipassword="$password$char"
echo -n "*"
done
ok,全部實現完畢,密碼存在password變數中。
錯誤解決
但在執行中會發現,按刪除(backspace)不會減少個數,反而增加了。直接執行read命令,然後按backspace鍵,會發現輸出了「^h」,這是因為backspace並未繫結為刪除功能,需要在指令碼中新增stty erase "^h"
來解決這一問題。但此時問題還是存在,原因在於backspace也是乙個按鍵,而while中的判斷並未判斷按鍵為backspace的情況,因而程式會執行到輸出一行。解決的方法就是在while中判斷backspace按鍵並進行相應的操作。
首先是判斷backspace按鍵,獲取backspace按鍵的方法有兩種:第一種是使用子shell輸出backspace的轉義字元即$(echo -ne "\b")
、第二種是利用vim,先按ctrl+v然後再backspace,就會輸出backspace的標誌。
然後是刪除之前的乙個字元,這裡使用shell的ansi控制碼,首先將游標前移乙個字元printf "33[1d"
,然後刪除游標之後的字元printf "33[k"
,當然,還要將最後乙個字元從password變數中移除。
最後完整的程式應該是:
x=0
while : ;do
char=`
stty cbreak -echo
dd if=/dev/tty bs=1 count=1 2>/dev/null
stty -cbreak echo
`if [ "$char" = "" ];then
break
fiif [[ "$ret" == $(echo -ne '\b') ]];then
if [ $x -eq 0 ];then
continue
fipassword="$"
printf "33[1d"
printf "33[k"
let x--
continue
fipassword="$password$char"
echo -n "*"
let x++
done
linux在終端輸入密碼時顯示星號的實現方法
當你在 web 瀏覽器或任何 gui 登入中輸入密碼時,密碼會被標記成星號 或圓點符號 這是內建的安全機制,以防止你附近的使用者看到你的密碼。但是當你在終端輸入密碼來執行任何 sudo 或 su 的管理任務時,你不會在輸入密碼的時候看見星號或者圓點符號。它不會有任何輸入密碼的視覺指示,www.cpp...
Python實現星號遮掩的密碼輸入
def pwd input msg import msvcrt,sys if msg sys.stdout.write msg chars while true newchar msvcrt.getch if newchar in 3 r n 如果是換行,ctrl c,則輸入結束 print if ...
帶星號的密碼輸入
在軟體開發中,往往會遇到要求使用者輸入密碼的情況。出於對密碼的保密,輸入的字元是不會顯示到螢幕上的。例如,在登入linux系統時,輸入使用者名稱後,輸入的密碼是不顯示的。可用getch 這個函式,但是在linux檔案下,此函式所在的標頭檔案為curses.h。curses庫是由柏克萊大學的bill ...