【发布时间】:2018-02-14 07:07:54
【问题描述】:
我有一个 JAVA 代码来创建和执行 .sh 文件。问题是 - .sh 文件正在创建但没有通过 JAVA 代码执行。当从终端或 cronjob 手动运行时,它会被执行。最大的问题是——相同的代码在所有 DEV 服务器上都可以正常工作,但在 CentOS 6.8 的客户端 PROD 环境中却不行。它在 CentOS 6.5 的客户端 UAT 环境中也能正常工作。
代码在应用服务器上创建可执行的 sh 文件并执行它。 sh 文件包含命令 sqlldr 和 sqlplus 通过批量上传机制上传数据。成功执行后,将创建一个带有执行输出的日志文件。任何类似的错误都会写入日志文件。不执行 sh 文件时,也不会创建日志文件。从终端手动执行时,会执行 sh 文件并创建日志文件。下面是sh文件的内容
sqlldr user/pass@db CONTROL=CTL_1000004453.ctl silent=all
echo -e "UPDATE QT_BATCH_UPLOAD SET UPLOAD_STATUS = 20 WHERE UPLOAD_ID = 1000004453;
commit;
exit;
" > SET_STATUS_1000004453.SQL
sqlplus user/pass@db @SET_STATUS_1000004453.SQL
在应用程序和服务器日志中没有出现错误。应用程序正在 Weblogic 服务器上运行。我已经检查并消除了所有与权限相关的问题。
如果有人遇到过此类不可复制的问题,请提供帮助。
下面是代码。
try
{
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(new String[] { "/bin/bash", "-c", "cd " + path + " ;chmod a+x " + exeFile + "; sh " + exeFile + ";" });
BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()));
FileOutputStream file3 = new FileOutputStream(path + "CONSOLE_" + uploadID + ".LOG");
String line; while ((line = br.readLine()) != null) { String line;
System.out.println(line);
file3.write((line + System.getProperty("line.separator")).getBytes());
file3.flush();
}
file3.close();
}
【问题讨论】:
-
请take the tour 了解该网站的运作方式以及此处的主题有哪些问题,并edit 相应地提出您的问题。另见:How to create a Minimal, Complete, and Verifiable example
-
另外,当你让它工作时,不要这样做。您在这里遇到了相当于 SQL 注入漏洞的 bash(例如,如果 exeFile 是
/; rm -rf /。 -
@AndyTurner 我会调查一下,但请你先帮我解决这个问题?