3

我想从我的 Java servlet 执行一个简单的 Unix 命令:我需要做的是一个简单的回显写入文件,如下所示:

echo HELLO > myfile.txt

我在我的 servlet 中所做的是:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletAutorecovery extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > ../webapps/test/myfile.txt");
            pb.start();
        } finally { 
        out.close();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }
}

我的问题是:此代码部分没有给我任何错误,但没有任何反应。在我执行了我的 servlet 之后,该文件并没有被创建,当然,其中也没有写入任何内容。

我究竟做错了什么?

EDIT1:添加了 pb 命令的完整路径。

EDIT2:bash在路径/usr/bin/bash中,100% 确定。

EDIT3:添加了 SSCCE。

4

3 回答 3

8

首先,你确定 bash 肯定是在/usr/bin吗?其次,您可能需要告诉 ProcessBuilder 在运行进程时它应该使用哪个目录作为 cwd,否则它将尝试在 servlet 容器的当前目录中创建 myfile.txt,通常是在您没有写入的地方使用权。第三,当你从java运行一个进程时,进程的输出通过进程对象上的输入流传递回java,它不会直接进入stdout,所以你需要读取流来查看结果

ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > myfile.txt");
pb.directory(...);
pb.redirectErrorStream(true);
Process p = pb.start();
IOUtils.copy(p.getInputStream(), System.out);
p.waitFor();
于 2013-02-05T08:58:39.223 回答
3
String echo = "echo 'hello' > myfile.txt";
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", echo);
pb.start();
于 2013-02-05T09:00:40.823 回答
0

检查您的错误处理;你可能在某个地方吞下了一个异常,因为没有bashin /usr/bin,所以你得到一个“找不到文件”异常(或类似的)。

试试"/bin/bash"吧。其余的应该工作。

另请注意,在您部署应用程序后,相对路径将不起作用,因为它将与运行 Java VM 的进程相关,这不是您期望、想要或可以使用的。询问您ServletContext的路径getRealPath()

于 2013-02-05T08:53:51.320 回答