2010-10-20 167 views
243

我有一個腳本可以自動執行需要訪問密碼保護系統的進程。系統通過一個接受用戶密碼作爲參數的命令行程序來訪問。如何從shell腳本獲取密碼而不回顯

我想提示用戶輸入他們的密碼,將其分配給shell變量,然後使用該變量構造訪問程序的命令行(這當然會產生流輸出,我將處理)。我是Bourne/Bash的一名合理的shell編程人員,但我不知道如何接受用戶輸入而不會迴應到終端(或者可能會使用'*'字符回顯)。

任何人都可以幫忙嗎?

+1

可能重複[如何使bash腳本要求輸入密碼?](http://stackoverflow.com/questions/2654009/how-to-make-bash-script -ask-for-a-password) – 2015-02-14 10:23:42

回答

373

這裏是另一種方式來做到這一點:

#!/bin/bash 
# Read Password 
echo -n Password: 
read -s password 
echo 
# Run Command 
echo $password 

read -s將關閉回聲你。只需將最後一行的echo替換爲您想要運行的命令即可。

+56

有些shell允許你指定'讀命令:'讀-s -p「密碼:」密碼「 – 2010-10-20 19:40:05

+5

我絕對更喜歡'讀-s -p',很多感謝簡化我的腳本。 – 2013-02-05 21:05:01

+25

請注意,'read -s'不在POSIX中,如果你使用它,你的腳本依賴於bash。如果你想符合POSIX標準,你應該使用下面建議的'stty -echo'解決方案,因爲'stty'及其''echo'參數在POSIX中定義。 – scy 2014-01-22 11:28:51

3

打開echo關閉使用stty,然後再打開後。

124
#!/bin/bash 
stty -echo 
printf "Password: " 
read PASSWORD 
stty echo 
printf "\n" 
+0

@RichardRiley - 假設你的意思是「read -s密碼」,這是正確的嗎? – 2013-02-05 20:58:08

+0

最初被接受爲最佳解決方案,並在我正在編寫的腳本中使用,但是「read -s -p」密碼:「PASSWORD」似乎簡單得多。 – 2013-02-05 21:04:08

+38

不,真的,如果你想符合POSIX標準,_do_使用'stty'。這個答案中的代碼甚至不在bash中運行,但實際上在符合POSIX的_all_ shell上運行。 – scy 2014-01-22 11:33:24

57

一個內膽:

read -s -p "Password: " password 

在Linux(和Cygwin)這種形式在bash和sh工作。不過,它可能不是標準的Unix sh。

欲瞭解更多信息和選項,請在bash中輸入「幫助閱讀」。

$ 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 
+1

如果命令生成「read:Illegal option -s」,則表示該腳本需要直接執行(./script vs sh ./script)...請參閱http://stackoverflow.com/questions/30554353/linux-非法選項讀取-a – 2015-12-24 15:40:04

-4
echo yourpassword | passwd --stdin youruser 
33

read-s選項未在POSIX標準中定義。見http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html。我想要一些適用於任何POSIX外殼的東西,所以我寫了一個使用stty禁用回顯的小函數。

#!/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 "[email protected]" 

    # 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_secretread_secret的輸入顯示爲空,因爲它未回顯給終端。

[[email protected] ~]$ read a b c 
foo \bar baz \qux 
[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=bar c=baz qux 
[[email protected] ~]$ unset a b c 
[[email protected] ~]$ read_secret a b c 

[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=bar c=baz qux 
[[email protected] ~]$ unset a b c 

這是另一個使用-r選項來保留輸入中的反斜槓。這是有效的,因爲上面定義的read_secret函數將所有收到的參數傳遞給read命令。

[[email protected] ~]$ read -r a b c 
foo \bar baz \qux 
[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=\bar c=baz \qux 
[[email protected] ~]$ unset a b c 
[[email protected] ~]$ read_secret -r a b c 

[[email protected] ~]$ echo a=$a b=$b c=$c 
a=foo b=\bar c=baz \qux 
[[email protected] ~]$ unset a b c 

最後,這裏是展示瞭如何使用read_secret功能來讀取一個POSIX兼容的方式輸入密碼的例子。

printf "Password: " 
read_secret password 
# Do something with $password here ... 
+3

應該確保echo在shell中沒有被禁用,並且如果它不在之前就不啓用它......可以使用'oldtty = stty -g'然後在最後' stty $ oldtty'恢復以前的設置。否則,這很好。 – Perkins 2016-04-01 05:33:59

-3

首先,如果有人打算在文件中存儲任何密碼。我會確保它被散列。這不是最好的安全性,但至少它不會是明文的。

  1. 首先創建密碼散列和它:

    回聲 「password123」 | md5sum |現在創建你的程序來使用散列,在這種情況下,這個小程序接收用戶輸入的密碼而不回顯,然後將其轉換爲哈希以便將其轉換爲散列與存儲的散列進行比較。 !如果存儲的哈希則訪問匹配:

    #/斌/慶典

    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 
    
+1

因爲'\ n'並不是提供的密碼的一部分,所以我建議通過使用'echo -n'將'echo'命令產生的換行字符'\ n'避開哈希值 - 當然, '/ tmp/secret'和你的例子中的比較。 – 2016-10-12 10:23:13

2

我發現是在askpass命令有用

password=$(/lib/cryptsetup/askpass "Give a password") 

每個輸入字符被*替換。請參閱: 給出一個密碼****

+0

這個'/ lib/cryptsetup/askpass'從哪裏來?這當然不是標準的* nix(或GNU/Linux)工具。 – 2017-06-19 19:13:58

+0

這是迄今爲止我見過的最好的解決方案。它來自cryptsetup,這是加密硬盤驅動器的標準,非常常用。 'sudo apt-get install cryptsetup'。 – 2017-07-08 15:18:32

+0

我試過用這個,星星沒有出現,再加上它弄亂了我的終端大時間,直到我關閉它。任何進一步的shell輸入被隱藏! – Jeff 2018-01-19 14:12:04

相關問題