gpt4 book ai didi

linux - 使用shell脚本解析复杂的字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:47 25 4
gpt4 key购买 nike

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

最佳答案

看起来你可以使用 eval 让 shell 解析你的输入字符串,但如果你不控制输入(如果它来自不可靠的来源),那将引入一个重大漏洞(假设攻击者以某种方式将 -c "rm -rf/" 传递给您的程序)。

更安全的方法是明确指定允许的用户输入形式。

如果您指定有效的字段(内容,而不是),如果空格被引用,您在空间分割(使用cut)时遇到的问题可以避免分隔符),例如在 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"

关于linux - 使用shell脚本解析复杂的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47801037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com