我尝试使用流程构建器通过java servlet执行一个简单的shell脚本,而且我没有得到任何输出。我搜索了堆栈溢出的解决方案的数量,但没有任何帮助我... 这是我试图执行的代码..
HTML:
<form method="post" action="SmxServlet">
<input type="submit" value="Click">
</form>
Shell脚本:
echo Hello world!, here your args $@ > log.html 2>&1
SmxServlet.java:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
String[] command = {"/bin/bash", "test.sh", "Argument1"};
ProcessBuilder p = new ProcessBuilder(command);
Process p2 = p.start();
try {
p2.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line;
System.out.println("Output of running " + command + " is: ");
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//RequestDispatcher dispatcher = request.getRequestDispatcher("log.html");
//dispatcher.forward(request, response);
}
正如在控制台中一样,我在下面没有任何价值:
Output of running [Ljava.lang.String;@77f03096 is:
有人可以帮忙吗?我有什么不对的吗?如何解决?真的很感谢你的帮助!
答案 0 :(得分:0)
您的命令不会在标准输出上生成任何输出,因此Java不会收到任何输出。这是因为你的echo命令将所有内容发送到文件log.html
而不是标准输出流。
但是,还有另一个问题:感叹号在shell中有特殊含义。如果您手动运行脚本,则会看到类似bash: !,: event not found
所以你需要逃避感叹号。
将test.sh
中的命令更改为
echo Hello world\!, here your args $@
让它发挥作用