我尝试了一整天找到一个用shell脚本解析一些字符串的好方法。这些字符串用作某些应用程序的调用参数。
他们看起来像是:parsingParams -c "id=uid5 prog=/opt/bin/example arg=\"-D -t5 >/dev/null 1>&2\" info='fdhff fd'" start
我只允许使用shell脚本。我尝试使用一些sed和cut命令,但没有什么工作正常。
我的尝试就像:
prog=$(echo $@ | cut -d= -f3 | sed 's|\s.*$||')
返回正确的prog值,但对于arg的值,我找不到一个很好的方法来获取它。 info参数是可选的,也可以保留。 任何人都有一个好主意可以解决这个问题吗? 非常感谢提前
答案 0 :(得分:4)
看起来您可以使用eval
让shell解析您的输入字符串,但如果您不控制输入(如果它来自不可靠的源),那将引入一个主要漏洞(想象一下攻击者以某种方式将-c "rm -rf /"
传递给您的程序)。
更安全的方法是明确指定允许的用户输入形式。
如果您指定了有效字段(内容,而不是分隔符>),则可以避免在引用空格时分割空间(使用cut
)时遇到的问题em>),例如在GNU awk
中,您可以使用FPAT
:
$ params="id=uid5 prog=/opt/bin/example arg=\"-D -t5 >/dev/null 1>&2\" info='fdhff fd'"
$ awk -v FPAT="[^=]+=(\"[^\"]*\"|'[^']*'|[^ ]*) *" '{for (i=1; i<=NF; i++) print $i}' <<<"$params"
id=uid5
prog=/opt/bin/example
arg="-D -t5 >/dev/null 1>&2"
info='fdhff fd'
有效字段将采用以下形式之一:
var="val with spaces"
var='val with spaces'
var=val_no_spaces
现在分配分配(每行一个,假设params
中不允许换行),您可以进一步处理它们,即使使用cut
:
$ awk ... | cut -d $'\n' -f3
arg="-D -t5 >/dev/null 1>&2"
答案 1 :(得分:1)
EVAL
$ eval "id=uid5 prog=/opt/bin/example arg=\"-D -t5 >/dev/null 1>&2\" info='fdhff fd'"
$ echo $id
uid5
$ echo $prog
/opt/bin/example
$ echo $arg
-D -t5 >/dev/null 1>&2
$ echo $info
fdhff fd