我试图用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,我甚至去了服务器计算机并从那里尝试了命令,没有问题。伙计们,请帮忙:(
答案 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
感谢您的帮助!