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

问题描述:

即时尝试发送一封电子邮件与Java的Linux命令,我承认我不太了解Linux,但我认为iv'e尝试一切,我真的非常困惑,如果有人能提供一些线索为从java运行linux命令,错误500,无法运行程序没有这样的文件或目录

我的应用程序导出到一个WAR文件,并将其上传到Linux服务器将是巨大的(CentOS的)

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

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

    String cmd = "mail -s \"Test Email\" [email protected] < /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”测试电子邮件“[email protected] < /usr/share/apache-tomcat-7.0.42/webapps/slots_dashboard/alert_mail.txt” :error = 2,没有这样的文件或目录

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

好吧,我终于找到了正确的方式做到这一点,答案是 here

感谢您的帮助反正!

这可能是你的Tomcat用户没有访问该文件。难道手动尝试该命令时,使用相同的用户名?

+0

嘿感谢您的答复,我检查了,我应该访问, 进一步的调查显示,我尝试没有任何参数的任何命令工作正常,但带参数的命令返回错误,我想我没有正确执行它java,我只是不知道如何 – 2015-01-04 15:03:57

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

ProcessBuilder pb = new ProcessBuilder("mail", "-s", "\"Test Email\"", "[email protected]", "<", "/usr/share/apache-tomcat-7.0.42/webapps/slots_dashboard/alert_mail.txt"); 

我在黑暗中拍摄很明显,但值得一拍。

+1

我想说你在黑暗中的射击已经达到了目标。 +1 – 2015-01-04 15:21:10

+0

嘿谢谢,它看起来是正确的方向,只有现在程序只是挂起,浏览器处于永久加载状态,任何想法? 另外,我已经尝试做errorStream和InputStream在2个单独的线程中读取,我基本上复制了这个问题的代码http://*.com/questions/13008526/runtime-getruntime-execcmd-nging – 2015-01-04 15:37:17

+0

可能是' yarons 2015-01-04 15:43:47