【问题标题】:running linux command from java, error 500, Cannot run program No such file or directory [duplicate]从java运行linux命令,错误500,无法运行程序没有这样的文件或目录[重复]
【发布时间】:2015-01-04 14:27:58
【问题描述】:

我试图通过 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 "Test Email" my@email.com

如果我将命令更改为 whoami,我会在响应中得到 tomcat,我什至去了服务器计算机并从那里尝试了命令,没有问题。各位大侠,请帮忙:(

【问题讨论】:

    标签: java linux shell


    【解决方案1】:

    不知道是不是这个原因,但是我看到的关于如何使用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
    • 嘿,谢谢,这似乎是正确的方向,只是现在程序刚刚挂起,浏览器处于永久加载状态,有什么想法吗?另外,我已经尝试在 2 个单独的线程中读取 errorStream 和 InputStream,我基本上从这个问题中复制了代码stackoverflow.com/questions/13008526/…
    • 可能&lt; 没有按预期工作,邮件命令等待电子邮件内容
    • 另一个猜测:不是在命令末尾使用&lt; path-to-file,而是使用redirectInput 来读取文件的内容作为输入。 docs.oracle.com/javase/7/docs/api/java/lang/…
    【解决方案2】:

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

    【讨论】:

    • 嘿,谢谢您的回复,我检查了,我应该可以访问,进一步调查表明我尝试的任何没有参数的命令都可以正常工作,但是带参数的命令返回错误,我想我不是从java正确执行它,我只是不知道如何
    猜你喜欢
    • 2018-04-13
    • 2016-08-22
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    相关资源
    最近更新 更多