从java运行linux命令,错误500,无法运行程序没有这样的文件或目录

时间:2015-01-04 14:27:59

标签: java linux shell

我试图用Java发送一封带有Linux命令的电子邮件,我承认我对Linux知之甚少,但我认为我已经尝试了一切,我真的很困惑,如果有人可以为它提供一些启示会很棒

我将应用程序导出到war文件并将其上传到linux服务器(CentOS)

所以这就是我正在做的事情:我用浏览器从servlet触发代码

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    String cmd = "mail -s \"Test Email\" my@email.com < /usr/share/apache-tomcat-7.0.42/webapps/slots_dashboard/alert_mail.txt";

    //String cmd = "whoami"; //returns tomcat

    ProcessBuilder pb = new ProcessBuilder(cmd);
    Process proc = pb.start();

    BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));

    BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

    String s = null;

    while ((s = stdInput.readLine()) != null) {
        resp.getWriter().println(s);
    }

    while ((s = stdError.readLine()) != null) {
        resp.getWriter().println(s);
    }
}

我得到的错误是: HTTP状态500 - 无法运行程序“mail -s”测试电子邮件“my@email.com&lt; /usr/share/apache-tomcat-7.0.42/webapps/slots_dashboard/alert_mail.txt”:错误= 2,没有这样的文件或目录

如果我将命令更改为whoami我在响应中获取tomcat,我甚至去了服务器计算机并从那里尝试了命令,没有问题。伙计们,请帮忙:(

3 个答案:

答案 0 :(得分:2)

不知道是不是这个原因,但我看到的关于如何使用ProcessBuilder的所有示例都使用字符串列表作为构造函数的参数(每个参数一个字符串),而不是一个长整个命令的字符串。 也许值得尝试类似的东西:

ProcessBuilder pb = new ProcessBuilder("mail", "-s", "\"Test Email\"", "my@email.com", "<", "/usr/share/apache-tomcat-7.0.42/webapps/slots_dashboard/alert_mail.txt");
显然,我在黑暗中射击。但值得一试。

答案 1 :(得分:1)

可能是您的tomcat用户无权访问该文件。手动尝试该命令时是否使用相同的用户名?

答案 2 :(得分:0)

好吧我终于找到了正确的方法,答案是 here

感谢您的帮助!