禁用bash脚本输入参数替换

时间:2018-05-17 15:37:40

标签: bash shell sh

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进程没有选择以不同的方式传递参数,例如使用转义斜杠。

有什么想法吗?

2 个答案:

答案 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使用。