[英]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.