簡體   English   中英

禁用bash腳本輸入參數替換

[英]Disable bash script input arguments substitution

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 / spark-submit

/ bin / spark-submit

$ {hadoopconf-yarn.resourcemanager.hostname}

yarn.resourcemanager.hostname

Java進程無法以不同的方式傳遞參數,例如使用轉義斜杠。

有任何想法嗎?

將其傳遞給'(單引號)。 單引號阻止擴展。

也就是說,類似:

./spark_submit.sh '${SPARK_HOME}/bin/spark-submit' --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address='${hadoopconf-yarn.resourcemanager.hostname}:18080'

僅當有一個外殼程序是外殼程序腳本的父進程時,才出現此問題,甚至在腳本啟動之前將單個字符串分解為參數列表(並對其進行擴展)。 當使用與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();

就是說,以這種形式期望參數的腳本是一種“代碼氣味”,它在處理參數的方式中可能存在嚴重的安全漏洞 請注意,傳入的值是經過審核/審查/控制的,或者(更好!)請他人重寫它以避免使用eval

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM