shell實現輸入密碼顯示星號

2022-06-16 19:39:14 字數 2242 閱讀 7593

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 ...