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 输出。

问:可以使用吗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

您可以根据您的使用情况调整这个答案。

相关内容