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 [email protected]

+ kinit [email protected]
+ echo secretpassword
...(kinit output)...

代替案:使用printenv passwd

printenvそれでパスワードをstdin、代わりに書いてみましたecho

(is this ok?)
$ printenv passwd | kinit [email protected]

+ kinit [email protected]
+ printenv passwd
...(kinit output)...

試みると、bash出力にパスワードが印刷されません。

Q:使用できますかprintenv

しかし、本当に安全ですか?パスワードを漏らすことができるbash設定はどこにありますか?

set -x編集:stdout / stderrで印刷することが修正されたとは思わないでください。

答え1

を使用すると、printenv変数をエクスポートする必要があります。つまり、変数をスクリプト内の他のコマンドに公開する必要があります。ただし、変数のエクスポートと入力としての使用の間に他のコマンドがなく、使用後すぐに設定を解除すると、誤ってログにダンプされる可能性が低くなります。

Bashを使用している場合は、次の文字列を使用できます。

kinit [email protected] <<<"$passwd"

ここにある文字列はset -x出力に含まれず、変数をエクスポートする必要はありません。

$ bar=abc
+ bar=abc
$ cat <<<"$bar"
+ cat
abc

ただし、ここの文字列は一時ファイルを生成するため、潜在的な漏洩の原因と見なすことができます。

答え2

sshpass一時fdを使用してstdinの代わりにパラメータとしてパスワードを使用する例を見てみましょうset -x。これを使用すると、パスワードは印刷されません。

#Set the password as an environment variable
export password=MyPassword
#Create the file descriptor 3 and link it to /tmp/pwd, you can use one from 3 to 9.
exec 3<> /tmp/pwd
#Copy the content of password  env variable to /tmp/pwd using dd command
dd of=/tmp/pwd <<< "$password" 
#Here using cat and passing it to xargs so stdout will be catched by stdin of xargs, then the password will be available within the second  curly brackets
cat /tmp/pwd  | xargs -I {} sshpass -p {} ssh <user>@<ip>
#Close the file descriptor
exec 3>&-
#Remove the tmp file
rm -f /tmp/pwd

この回答をユースケースに合わせて調整できます。

関連情報