Bash

bash 將環境變數安全地通過管道傳輸到標準輸入

  • December 16, 2020

我有一個儲存在環境變數中的密碼。

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

但是這裡的字元串會創建臨時文件,因此可以將其視為潛在的洩漏源。

引用自:https://unix.stackexchange.com/questions/624812