我有一個腳本能夠自動執行須要訪問受密碼保護的系統的進程。 經過命令行程序訪問系統,該程序接受用戶密碼做爲參數。 html
我想提示用戶鍵入他們的密碼,將其分配給shell變量,而後使用該變量構建訪問程序的命令行(這固然會產生我將處理的流輸出)。 程序員
我是Bourne / Bash中一個至關稱職的shell程序員,但我不知道如何接受用戶輸入而不讓它回顯到終端(或者可能使用'*'字符回顯)。 shell
有人能幫忙嗎? 小程序
一個班輪: 安全
read -s -p "Password: " password
在Linux(和cygwin)下,這個表單適用於bash和sh。 但它可能不是標準的Unix sh。 bash
有關更多信息和選項,請在bash中鍵入「help read」。 函數
$ help read read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] Read a line from the standard input and split it into fields. ... -p prompt output the string PROMPT without a trailing newline before attempting to read ... -s do not echo input coming from a terminal
該-s
的選項read
未在POSIX標準定義。 請參見http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html 。 我想要一些適用於任何POSIX shell的東西,因此我編寫了一個使用stty
來禁用echo的小函數。 spa
#!/bin/sh # Read secret string read_secret() { # Disable echo. stty -echo # Set up trap to ensure echo is enabled before exiting if the script # is terminated while echo is disabled. trap 'stty echo' EXIT # Read secret. read "$@" # Enable echo. stty echo trap - EXIT # Print a newline because the newline entered by the user after # entering the passcode is not echoed. This ensures that the # next line of output begins at a new line. echo }
此函數的行爲與read
命令很是類似。 如下是read
的簡單用法,後面是read_secret
的相似用法。 read_secret
的輸入顯示爲空,由於它未回顯到終端。 命令行
[susam@cube ~]$ read a b c foo \bar baz \qux [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=bar c=baz qux [susam@cube ~]$ unset a b c [susam@cube ~]$ read_secret a b c [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=bar c=baz qux [susam@cube ~]$ unset a b c
這是另外一個使用-r
選項來保留輸入中的反斜槓。 這是有效的,由於上面定義的read_secret
函數將它接收的全部參數傳遞給read
命令。 code
[susam@cube ~]$ read -r a b c foo \bar baz \qux [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=\bar c=baz \qux [susam@cube ~]$ unset a b c [susam@cube ~]$ read_secret -r a b c [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=\bar c=baz \qux [susam@cube ~]$ unset a b c
最後,這是一個示例,說明如何使用read_secret
函數以符合POSIX的方式讀取密碼。
printf "Password: " read_secret password # Do something with $password here ...
首先,若是有人要在文件中存儲任何密碼,我會確保它已經散列。 這不是最好的安全性,但至少它不會是純文本。
首先,建立密碼並將其哈希:
echo "password123" | md5sum | cut -d '-' -f 1 > /tmp/secret
如今,建立您的程序以使用哈希。 在這種狀況下,這個小程序接收用戶輸入密碼而不回顯,而後將其轉換爲散列以與存儲的散列進行比較。 若是它與存儲的哈希匹配,則授予訪問權限:
#!/bin/bash PASSWORD_FILE="/tmp/secret" MD5_HASH=$(cat /tmp/secret) PASSWORD_WRONG=1 while [ $PASSWORD_WRONG -eq 1 ] do echo "Enter your password:" read -s ENTERED_PASSWORD if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d '-' -f 1)" ]; then echo "Access Deniend: Incorrenct password!. Try again" else echo "Access Granted" PASSWORD_WRONG=0 fi done
使用stty
關閉echo
,而後再從新打開。
符合POSIX的答案。 注意使用/bin/sh
而不是/bin/bash
。 (它確實與bash一塊兒使用,但它不須要 bash。)
#!/bin/sh stty -echo printf "Password: " read PASSWORD stty echo printf "\n"