我有一个密码存储在环境变量中。
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
您可以根据您的使用情况调整这个答案。