Bash
bash 將環境變數安全地通過管道傳輸到標準輸入
我有一個儲存在環境變數中的密碼。
read -s passwd export passwd
壞:使用
echo $passwd
現在我想通過管道將它傳遞給一個接受密碼的命令
stdin
(例如,kinit
)。但是,如果 bash 已set -x
啟用,那麼這將洩露密碼。(warning: will leak password if set -x is enabled) $ echo $passwd | kinit x@example.com + kinit x@example.com + echo secretpassword ...(kinit output)...
替代方案:使用
printenv passwd
所以我習慣
printenv
將密碼寫入stdin
,而不是echo
。(is this ok?) $ printenv passwd | kinit x@example.com + kinit x@example.com + printenv passwd ...(kinit output)...
當我嘗試它時,這不會將密碼列印到 bash 輸出。
問:可以用
printenv
嗎?但這真的安全嗎?是否有可能在某處洩露密碼的 bash 配置?
編輯:不要認為
set -x
列印到 stdout/stderr,已修復。
使用
printenv
,必須導出變數,這意味著您將其暴露給腳本中的其他命令,其中任何一個都可能洩漏它。但是,如果在導出變數和將其用作輸入之間沒有其他命令,並且您在使用後立即取消設置,則不太可能意外將其轉儲到日誌中。如果您使用的是 bash,則可以使用 herestring:
kinit x@example.com <<<"$passwd"
Herestrings不包含在
set -x
輸出中,並且不需要導出變數:$ bar=abc + bar=abc $ cat <<<"$bar" + cat abc
但是這裡的字元串會創建臨時文件,因此可以將其視為潛在的洩漏源。