我有一個腳本可以自動執行需要訪問密碼保護系統的進程。系統通過一個接受用戶密碼作爲參數的命令行程序來訪問。如何從shell腳本獲取密碼而不回顯
我想提示用戶輸入他們的密碼,將其分配給shell變量,然後使用該變量構造訪問程序的命令行(這當然會產生流輸出,我將處理)。我是Bourne/Bash的一名合理的shell編程人員,但我不知道如何接受用戶輸入而不會迴應到終端(或者可能會使用'*'字符回顯)。
任何人都可以幫忙嗎?
我有一個腳本可以自動執行需要訪問密碼保護系統的進程。系統通過一個接受用戶密碼作爲參數的命令行程序來訪問。如何從shell腳本獲取密碼而不回顯
我想提示用戶輸入他們的密碼,將其分配給shell變量,然後使用該變量構造訪問程序的命令行(這當然會產生流輸出,我將處理)。我是Bourne/Bash的一名合理的shell編程人員,但我不知道如何接受用戶輸入而不會迴應到終端(或者可能會使用'*'字符回顯)。
任何人都可以幫忙嗎?
這裏是另一種方式來做到這一點:
#!/bin/bash
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password
的read -s
將關閉回聲你。只需將最後一行的echo
替換爲您想要運行的命令即可。
有些shell允許你指定'讀命令:'讀-s -p「密碼:」密碼「 – 2010-10-20 19:40:05
我絕對更喜歡'讀-s -p',很多感謝簡化我的腳本。 – 2013-02-05 21:05:01
請注意,'read -s'不在POSIX中,如果你使用它,你的腳本依賴於bash。如果你想符合POSIX標準,你應該使用下面建議的'stty -echo'解決方案,因爲'stty'及其''echo'參數在POSIX中定義。 – scy 2014-01-22 11:28:51
打開echo
關閉使用stty
,然後再打開後。
#!/bin/bash
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
@RichardRiley - 假設你的意思是「read -s密碼」,這是正確的嗎? – 2013-02-05 20:58:08
最初被接受爲最佳解決方案,並在我正在編寫的腳本中使用,但是「read -s -p」密碼:「PASSWORD」似乎簡單得多。 – 2013-02-05 21:04:08
不,真的,如果你想符合POSIX標準,_do_使用'stty'。這個答案中的代碼甚至不在bash中運行,但實際上在符合POSIX的_all_ shell上運行。 – scy 2014-01-22 11:33:24
一個內膽:
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
如果命令生成「read:Illegal option -s」,則表示該腳本需要直接執行(./script vs sh ./script)...請參閱http://stackoverflow.com/questions/30554353/linux-非法選項讀取-a – 2015-12-24 15:40:04
echo yourpassword | passwd --stdin youruser
的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_secret
。 read_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 ...
應該確保echo在shell中沒有被禁用,並且如果它不在之前就不啓用它......可以使用'oldtty = stty -g'然後在最後' stty $ oldtty'恢復以前的設置。否則,這很好。 – Perkins 2016-04-01 05:33:59
首先,如果有人打算在文件中存儲任何密碼。我會確保它被散列。這不是最好的安全性,但至少它不會是明文的。
首先創建密碼散列和它:
回聲 「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
因爲'\ n'並不是提供的密碼的一部分,所以我建議通過使用'echo -n'將'echo'命令產生的換行字符'\ n'避開哈希值 - 當然, '/ tmp/secret'和你的例子中的比較。 – 2016-10-12 10:23:13
我發現是在askpass
命令有用
password=$(/lib/cryptsetup/askpass "Give a password")
每個輸入字符被*替換。請參閱: 給出一個密碼****
這個'/ lib/cryptsetup/askpass'從哪裏來?這當然不是標準的* nix(或GNU/Linux)工具。 – 2017-06-19 19:13:58
這是迄今爲止我見過的最好的解決方案。它來自cryptsetup,這是加密硬盤驅動器的標準,非常常用。 'sudo apt-get install cryptsetup'。 – 2017-07-08 15:18:32
我試過用這個,星星沒有出現,再加上它弄亂了我的終端大時間,直到我關閉它。任何進一步的shell輸入被隱藏! – Jeff 2018-01-19 14:12:04
可能重複[如何使bash腳本要求輸入密碼?](http://stackoverflow.com/questions/2654009/how-to-make-bash-script -ask-for-a-password) – 2015-02-14 10:23:42