用shell實現乙個「輸入密碼」程式

2022-05-08 21:06:12 字數 1827 閱讀 4898

在寫安裝程式免不了要輸入密碼一類的,c裡比較直白,getchar()加printf()一想就可以了,具體的邏輯實現也不會多難。可是在shell這種限制性語言裡可沒那麼簡單了,比如你想下輸入命令read,怎麼能唯讀入乙個字元就退出呢?

於是我上網搜了搜,改了改,感興趣的不如一起來學習下。

getchar() 

while

: ; 

doret

=`getchar`

case

"$ret"in

^h) str

=$(echo $str

|sed 

's/.$//')

echo 

-ne 

"\b \b";;

"") 

break

;;;      

*) str="

$str$ret

"echo -n 

"*"esac

done

getchar()函式就仿c語言的自己做了乙個,每次輸入乙個字元就退出。

具體的stty的設定

可以自己man,這裡第一行設定了「擊一下鍵盤輸入乙個字元就會響

應,而不是等到輸入回車按

行響應」。第三行恢復設定。第二行dd是個linux命令:

dd命令:

功能說明:讀取,轉換並輸出資料。

語  法:dd [bs=《位元組數》][cbs=《位元組數》][conv=《關鍵字》][count=《區塊數》][ibs=《位元組數》][if=《檔案》][obs=《位元組數》][of=《檔案》][seek=《區塊數》][skip=《區塊數》][--help][--version]

補充說明:dd可從標準輸入或檔案讀取資料,依指定的格式來轉換資料,再輸出到檔案,裝置或標準輸出。

參  數:

bs=《位元組數》   將ibs( 輸入)與obs(輸出)設成指定的位元組數。

cbs=《位元組數》   轉換時,每次只轉換指定的位元組數。

conv=《關鍵字》   指定檔案轉換的方式。

count=《區塊數》   僅讀取指定的區塊數。

ibs=《位元組數》   每次讀取的位元組數。

if=《檔案》   從檔案讀取。

obs=《位元組數》   每次輸出的位元組數。

of=《檔案》   輸出到檔案。

seek=《區塊數》   一開始輸出時,跳過指定的區塊數。

skip=《區塊數》   一開始讀取時,跳過指定的區塊數。

--help   幫助。

--version   顯示版本資訊。

主程式包含了乙個while迴圈來使你不斷輸入密碼。

ret=

`getchar` #取出輸入的值放到ret變數裡。這裡你需要了解``和$()的意思。

然後根據ret的值來相應的處理:

^h代表backspace。為什麼要對退格鍵進行特殊處理呢,你可以試一下,如果不特殊處理的話是不能發揮退格的功效的。為什麼不能發揮退格的功效呢,那是因為此時處於raw mode下,而非cooked mode下。精彩的就在特殊處理的部分,需要清楚的是所謂的特殊處理就是「刪除輸入backspace代表的字元(在raw模式下backpace鍵輸入的是^h),刪除乙個*號」 echo $str|

sed 

's/.$//   $代表最後一行,echo $str最後一行就是換行。.$就是倒數第二行最後乙個字元(即str最後乙個字元^h)。。替換成空就完成了「刪除輸入backspace代表的字元」,然後在echo "\b"刪除乙個*號就ok了。。。

在此不得不感嘆一下linux下這些命令功能的強大,聊聊兩句想實現什麼功能實現什麼功能,再感嘆設計者的強大。

然後輸入為空(回車)時退出迴圈,其他情況都是密碼顯示*號。

用pyinstaller打包乙個exe程式

f選項可以打出乙個exe檔案,預設是 d,意思是打成乙個資料夾。pyinstaller f testdatagen.py w選項可以打桌面程式,去掉命令列黑框 pyinstaller f w testdatagen.py i可以設定圖示路徑,將圖示放在根目錄 pyinstaller f w i ge...

shell實現輸入密碼顯示星號

shell指令碼可以使用read s來預設禁止回顯輸入字元,這樣做一定程度上可以保證安全性。但這並不是乙個好的互動,因為對於輸入密碼並不能知道已經輸入了多少個字元。而使用 星號 來代替輸入的字元是乙個很不錯的想法,即保證安全又有好的互動性。程式的實現 首先要實現不顯示輸入字元,這個可以使用命令stt...

用shell 實現自動ftp的乙個例項

bin bash echo echo cintel ftp test tool echo please input hostip c read hostip echo please input username c read username echo please input password c...