在不使用eval的情况下,在Heredoc /多行变量中插值Bash变量的安全方法是什么?

问题描述 投票:0回答:1

所以我有一个疯狂的想法,就是将文档嵌入到脚本中(这对我而言并不新鲜,只是新的),然后使用sed解析它们。我可以通过用行定界符注释掉一段文本,然后在将字符串打印到stdout时弹出注释哈希(在每一行上)来实现此目的。

作为示例,想象一个像这样的shell脚本myscript.sh

   #!/usr/bin/env bash
   #---- doc:start ----#
   # Hello $User\n     
   # This is myscript.sh
   # ${red}This will be red!${eol}
   #---- doc:end   ----#
   printf "Hello, World!"

我有一个sed脚本,该脚本可捕获线里程表之间的所有内容,并将其放入多行变量$doc

使用此变量,我想对任何局部变量(不一定是导出的变量),转义代码,术语颜色等进行插值,在查看如何执行此操作时,我唯一能找到的答案就是使用eval;这是一个工作示例(在这里使用字符串):

  while IFS= read -r line; do
    line=$(eval "echo -e \"$line\""); 
    echo "$line"
  done  <<< "$doc"; # doc is a multiline variable

但是,如果有人在此文本块中添加$(rm -rf ..),它将被执行;这种模式似乎允许其他unsafe方案。

[我看过的另一种方法是使用printf -v line ...动态分配变量,但无法成功进行变量替换。

我想在Bash 3.2上下文中实现此目标,而无需安装任何其他工具或实用程序;尽可能使用POSIX,但是Bashism和通用实用程序也可以。

也许是一个正则表达式,也可以排除看起来像可执行命令的东西(或其他超级转义的可疑字符串)。

bash sed eval string-interpolation
1个回答
0
投票

使用envsubst,来自GNU gettext包。

这仅需要导出应该被替换的变量。]​​>

envsubst
© www.soinside.com 2019 - 2024. All rights reserved.