数组 – 使用管道运行bash数组
发布时间:2020-12-15 21:09:25 所属栏目:安全 来源:网络整理
导读:如何从包含管道的bash数组运行命令行? 例如,我想运行ls | grep x通过以下方式: $declare -a pipeline$pipeline=(ls)$pipeline+=("|")$pipeline+=(grep x)$"${pipeline[@]}" 但我明白了: ls: cannot access |: No such file or directoryls: cannot access
如何从包含管道的bash数组运行命令行?
例如,我想运行ls | grep x通过以下方式: $declare -a pipeline $pipeline=(ls) $pipeline+=("|") $pipeline+=(grep x) $"${pipeline[@]}" 但我明白了: ls: cannot access |: No such file or directory ls: cannot access grep: No such file or directory ls: cannot access x: No such file or directory 解决方法
简短形式:你不能(没有编写一些代码),它是一个功能,而不是一个bug.
如果您以安全的方式做事,那么您将保护您的数据不被解析为代码(语法).但是,您明确要在此处将数据视为代码,但仅以受控方式处理. 您可以做的是遍历元素,使用printf’%q’“$element”获取安全引用的字符串(如果它们不是管道),如果它们是,则保留它们未被取代. 这样做之后,只有在这样做之后,才能安全地评估输出字符串. eval_args() { local outstr='' while (( $# )); do if [[ $1 = '|' ]]; then outstr+="| " else printf -v outstr '%s%q ' "$outstr" "$1" fi shift done eval "$outstr" } eval_args "${pipeline[@]}" 顺便说一下 – 不要这样做更安全.想想你正在处理文件列表的情况,其中一个名为|;攻击者可以使用此策略来注入代码.对前后数组使用单独的列表,或者只使管道的一侧成为一个数组并对另一个进行硬编码,这是更好的做法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |