Bash脚本由Java进程调用,如下所示:
./spark_submit.sh ${SPARK_HOME}/bin/spark-submit --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address=${hadoopconf-yarn.resourcemanager.hostname}:18080
我必须对输入参数运行操作,因此我检查每个参数并重建原始输入。
我通过访问$ 1值然后转移来逐个获取参数。
我找不到阻止bash解决的方法
$ {SPARK_HOME} / bin中/火花提交
到
/ bin中/火花提交
和
$ {hadoopconf-yarn.resourcemanager.hostname}
到
yarn.resourcemanager.hostname
Java进程没有选择以不同的方式传递参数,例如使用转义斜杠。
有什么想法吗?
答案 0 :(得分:1)
用'(单引号)传递它。单引号可防止扩展。
就是这样:
./spark_submit.sh '${SPARK_HOME}/bin/spark-submit' --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address='${hadoopconf-yarn.resourcemanager.hostname}:18080'
答案 1 :(得分:1)
如果有一个shell是shell脚本的父进程,将一个字符串分解为一个参数列表(并在它们上运行扩展),那么你只会遇到这个问题脚本甚至已经开始。当使用编程语言与C system()
函数类似时,通常会发生这种情况,该函数接受一个字符串并将其作为参数传递给sh -c '...'
。
由于该过程在脚本启动之前发生,您无法在脚本内部修复。
将一个文字参数列表传递给JVM,你不会遇到这个问题:
List<Array> args = Arrays.asList(
"./spark_submit.sh",
"${SPARK_HOME}/bin/spark-submit",
"--master", "yarn",
"--deploy-mode", "cluster",
"--conf", "spark.yarn.historyServer.address=${hadoopconf-yarn.resourcemanager.hostname}:18080");
ProcessBuilder p = new ProcessBuilder(args);
p.start();
那就是说,你的脚本期望这种形式的参数是一个&#34;代码气味&#34;它如何处理参数可能有serious security vulnerabilities;请注意传入的值是经过审计/审查/控制的,或者(更好!)有人重写它以避免eval
使用。