Bash
讓 bash 上的使用者輸入密碼成為程序標準輸入的一部分的最安全和最簡單的方法是什麼?
我正在尋找(1)最安全和(2)最簡單的方法,讓使用者在 bash shell 提示符下輸入密碼,並讓該密碼成為程序標準輸入的一部分。
這就是標準輸入需要的樣子:
{"username":"myname","password":"<my-password>"}
,在哪裡<my-password>
輸入到 shell 提示符中。如果我可以控制標準輸入程序,那麼我可以修改它以安全地提示輸入密碼並將其放置到位,但下游是標準的通用命令。我已經考慮並拒絕了使用以下內容的方法:
- 使用者在命令行中輸入密碼:密碼將顯示在螢幕上,所有使用者也可以通過“ps”看到
- 將 shell 變數插入到外部程序的參數中(例如,
...$PASSWORD...
):所有使用者仍然可以通過“ps”看到密碼- 環境變數(如果它們留在環境中):密碼將對所有子程序可見;如果它們轉儲核心或轉儲環境變數作為診斷的一部分,即使是值得信賴的程序也可能會暴露密碼
- 密碼長時間存在於文件中,即使是具有嚴格權限的文件:使用者可能會意外暴露密碼,而 root 使用者可能會意外看到密碼
我將把我目前的解決方案作為答案放在下面,但如果有人想出一個更好的答案,我會很樂意選擇一個更好的答案。我在想應該有一些更簡單的東西,或者也許有人看到了我錯過的安全問題。
使用
bash
或zsh
:unset -v password # make sure it's not exported set +o allexport # make sure variables are not automatically exported IFS= read -rs password < /dev/tty && printf '{"username":"myname","password":"%s"}\n' "$password" | cmd
沒有
IFS=
,read
會從您輸入的密碼中去除前導和尾隨空格。如果沒有
-r
,它會將反斜杠作為引用字元處理。你要確保你只從終端讀取。
echo
不能可靠地使用。bash
和zsh
,printf
是內置的,因此命令行不會顯示在ps
.在
bash
中,您需要引用$password
,否則將對其應用split+glob運算符。這仍然是錯誤的,因為您需要將該字元串編碼為 JSON。例如,雙引號和反斜杠至少會是一個問題。您可能需要擔心這些字元的編碼。您的程序是否需要 UTF-8 字元串?你的終端發送什麼?
要添加提示字元串,請使用
zsh
:IFS= read -rs 'password?Please enter a password: '
與
bash
:IFS= read -rsp 'Please enter a password: ' password