无法通过java servlet执行shell脚本

时间:2017-03-23 07:27:00

标签: java shell servlets processbuilder

我尝试使用流程构建器通过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: 

有人可以帮忙吗?我有什么不对的吗?如何解决?真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您的命令不会在标准输出上生成任何输出,因此Java不会收到任何输出。这是因为你的echo命令将所有内容发送到文件log.html而不是标准输出流。

但是,还有另一个问题:感叹号在shell中有特殊含义。如果您手动运行脚本,则会看到类似bash: !,: event not found

的错误

所以你需要逃避感叹号。

test.sh中的命令更改为

echo Hello world\!, here your args $@

让它发挥作用