使用shell脚本

时间:2017-12-13 19:47:54

标签: linux bash shell awk sed

我尝试了一整天找到一个用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参数是可选的,也可以保留。 任何人都有一个好主意可以解决这个问题吗? 非常感谢提前

2 个答案:

答案 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