如何從shell腳本獲取密碼而不進行回顯

我有一個腳本能夠自動執行須要訪問受密碼保護的系統的進程。 經過命令行程序訪問系統,該程序接受用戶密碼做爲參數。 html

我想提示用戶鍵入他們的密碼,將其分配給shell變量,而後使用該變量構建訪問程序的命令行(這固然會產生我將處理的流輸出)。 程序員

我是Bourne / Bash中一個至關稱職的shell程序員,但我不知道如何接受用戶輸入而不讓它回顯到終端(或者可能使用'*'字符回顯)。 shell

有人能幫忙嗎? 小程序


#1樓

一個班輪: 安全

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

#2樓

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

#3樓

首先,若是有人要在文件中存儲任何密碼,我會確保它已經散列。 這不是最好的安全性,但至少它不會是純文本。

  1. 首先,建立密碼並將其哈希:

    echo "password123" | md5sum | cut -d '-' -f 1 > /tmp/secret
  2. 如今,建立您的程序以使用哈希。 在這種狀況下,這個小程序接收用戶輸入密碼而不回顯,而後將其轉換爲散列以與存儲的散列進行比較。 若是它與存儲的哈希匹配,則授予訪問權限:

    #!/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

#4樓

使用stty關閉echo ,而後再從新打開。


#5樓

符合POSIX的答案。 注意使用/bin/sh而不是/bin/bash 。 (它確實與bash一塊兒使用,但它不須要 bash。)

#!/bin/sh
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
相關文章
相關標籤/搜索