加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数组 – 使用管道运行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[@]}"

顺便说一下 – 不要这样做更安全.想想你正在处理文件列表的情况,其中一个名为|;攻击者可以使用此策略来注入代码.对前后数组使用单独的列表,或者只使管道的一侧成为一个数组并对另一个进行硬编码,这是更好的做法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读