2

我正在写一个包装脚本。原始程序的参数在一个单独的文件中,args. 脚本需要拆分args使用shell参数规则的内容,然后运行程序。在没有 eval 的情况下根据 shell 参数规则将字符串拆分为标记中提供了部分解决方案 ( set+ eval) :

#!/usr/bin/env bash
STDOUT="$1"
STDERR="$2"
( set -f ; eval "set -- $(cat args)"; exec run_in_container "$@" >"$STDOUT" 2>"$STDERR" )

但在我的情况下args是用户生成的。不难想象

  • args:(echo "Hello, 'world'! $(rm -rf /)"不酷,但无害:命令在例如 docker 容器中运行)
  • args: bash -c "$JAVA_HOME/<...> > <...> && <...>"(有害:$JAVA_HOME原本是container的 environment variable 的值JAVA_HOME,但实际上会在更早的时候被替换,当eval'ing 包装脚本的子shell中的命令时。)

我尝试了 Python,这很有效:

#!/usr/bin/env python
import shlex, subprocess, sys

with open('args', 'r') as argsfile:
    args = argsfile.read()

with open(sys.argv[1], 'w') as outfile, open(sys.argv[2], 'w') as errfile:
    exit(subprocess.call(["run_in_container"] + shlex.split(args), stdout=outfile, stderr=errfile))

有没有办法shlex在 bash中做:使用 shell 参数规则标记字符串,但不要替换任何变量的值,不要执行$(...)等?

4

0 回答 0