问题
启动进程将在 bash 上输出敏感信息。我想提取出现模式的这个值并将其分配给 bash 变量。具体来说,启动进程 vault(来自 hashicorp)
$ vault server -dev
将产生如下输出
[...] 您可能需要设置以下环境变量:
$ export VAULT_ADDR='http://127.0.0.1:8200'
下面显示了解封密钥和根令牌,以防您想要密封/解封 Vault 或重新进行身份验证。
解封钥匙:n1yYaOhsKnE1mM+P1ezNTD1yHlhglmEM/F/+gzX0Zl0=
根令牌:s.k9C3agdaneOw809EnTqqErAM在生产安装中不应使用开发模式!
==> Vault 服务器已启动!日志数据将流入以下位置:
[...]
因此,我对从“Unseal Key: ”和“Root Token: ”中提取值很感兴趣。其他所有输出都可以存储在日志文件中(可选)。但是,这两个值(unseal key 和 root token)永远不应(直接)显示在命令行上,也不应存储在文件中。
方法
我尝试使用 sed 并将输出重定向到 read 命令来解决这个问题。它看起来像这样
$ read -r unseal_key root_token <<< $(vault server -dev | sed -n -e 's/Unseal Key: //p' -e 's/Root Token: //p' a.txt); echo "$unseal_key /\ $root_token"
a.txt 应该是一个日志文件,其余的输出都存储在其中。如前所述,这不是必需的。此命令的输出为空。通过拆分命令并仅执行
$ vault server -dev | sed -n -e 's/Unseal Key: //p' -e 's/Root Token: //p'
我观察到(对我来说)奇怪的行为,即替换的字符串出现在输出中的不同位置(但在一起)。
由于我不确定 sed 是否最适合这种情况,或者这是否可能,就像我所想的那样,请让我听听你的想法。
总结一下
- 启动进程会导致命令行输出
- 其中两行不应显示或临时存储在文件中
- 在变量中执行命令后,这两个值应该可以访问
答案1
首先捕获单个变量中的所有内容,然后作为单独的步骤提取信息:
stuff=$(vault server -dev)
if [[ $stuff =~ Unseal\ Key:\ ([^[:space:]]+) ]]; then
unseal_key=${BASH_REMATCH[1]}
else
die "Could not find unseal key in vault's output"
fi
if [[ $stuff =~ Root\ Token:\ ([^[:space:]]+) ]]; then
root_token=${BASH_REMATCH[1]}
else
当然,如果您愿意,也可以使用sed
或grep
,但 Bash 的内置正则表达式支持也可以。
或者,你可以将程序的输出重定向到存储在内存中的文件。对于交互式桌面会话(例如在你的开发电脑上),许多 Linux 发行版都会给你$XDG_RUNTIME_DIR
一个临时文件文件系统不对应任何磁盘存储 - 通常用于存储非常小的“运行时数据”。(实际上整个文件系统/run
也是 tmpfs,但只有 root 可以访问。)
请注意,这实际上是<<<
已经工作的。每次使用 bash<<EOF
或<<<
运算符时,它都会存储提供的文本在 /tmp 下的文件中。(如今,/tmp 通常是一个仅限内存的“tmpfs”,就像 /run 一样 - 但这是一个相对较新的功能;大多数较旧的 Linux 系统几乎总是将 /tmp 保存在磁盘上。)
因此,如果您真的不想将此密钥存储在磁盘上,那么就不要使用<<<
它<<
......