環境変数にパスワードが格納されています。
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
この回答をユースケースに合わせて調整できます。