我正在写一个包装脚本。原始程序的参数在一个单独的文件中,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 参数规则标记字符串,但不要替换任何变量的值,不要执行$(...)
等?