在开发(安全地)从配置文件加载分配的过程中,我试图想出一个shell函数:
${}
扩展...)但阻止任何不安全扩展(包括嵌套在其他构造中)。下面是一个示例(假设函数safeval
符合上述要求,并已在当前上下文中加载):
export A=1
safeval '$A$(ls /)' B
echo "$B" # Echoes 1$(ls /)
safeval '"a""b"' C
echo "$C" # Echoes ab
答案 0 :(得分:0)
按照上一个问题我问( Reading assignments from configuration files)以及mklement0的评论回答让我想到了这个问题的答案:Bash Templating: How to build configuration files from templates with Bash?,我想出了一个潜在的解决方案,我正在寻找反馈,特别是我可能错过了它的安全和潜在的失败模式。
#
# Argument 1 : string to safely expand
# Argument 2 : name of the variable to which expanded value will be assigned
#
safeval()
{
local _v=$1
_v=${_v//\$\(/\$$'\1'}
_v=${_v//\$\[/\$$'\2'}
_v=${_v//'`'/$'\3'}
_v=${_v//\\ /$'\4'}
_v=${_v// /$'\5'}
eval printf -v _v %b "$_v" || return 1
_v=${_v//$'\1'/\(}
_v=${_v//$'\2'/\[}
_v=${_v//$'\3'/'`'}
_v=${_v//$'\4'/\\ }
_v=${_v//$'\5'/ }
printf -v "$2" %s "$_v"
}
请注意,这(我认为应该)处理所提供的字符串中的不连续引用(例如,输入中的'"a"b"c"
将被指定为abc
)。
此代码旨在执行以下操作:
$(
,' $ ['和`有希望的安全字符串。eval
为了便于阅读,我在答案中保留了一些可避免的分配,我会在最终代码中删除。我也可能会将第一个printf
的stderr重定向到/dev/null
。
我使用%b
作为printf
的字符串格式,以允许配置文件中的换行符之类的内容。欢迎评论这是好是坏。