在java shell上执行Linux命令(mutt)不能正常工作

时间:2013-09-09 09:33:16

标签: java linux shell

我有一种情况,我希望(需要)在执行给定的java程序时通过电子邮件发送文件。复制命令在Windows和Linux上都可以正常执行,但是,当在java上执行执行时,mutt不能正常工作。命令字符串生成完美,(我目前手动键入打印到控制台的字符串以手动发送电子邮件),但Runtime.getRuntime.exec()没有正确执行它。

        if (OS.indexOf("win") >= 0)
        {
            // windows
            cmd = "cmd /C copy "+workbookFileName+" "+latestWorkbookFileName;
            System.out.println("executing command windows: "+cmd);
            Runtime.getRuntime().exec(cmd);
        }
        else
        {
   //         others
            cmd = "cp "+workbookFileName+" "+latestWorkbookFileName;
            System.out.println("executing Linux: "+cmd);
            Runtime.getRuntime().exec(cmd);



            cmd = "echo \"This is the message body\" | mutt -a \""+workbookFileName+"\" -s \"message subject\" -- sqlinjection@domain.com";
            System.out.println("executing Linux: "+cmd);
            Runtime.getRuntime().exec(cmd);

            System.out.println("bye");


        }

2 个答案:

答案 0 :(得分:0)

这是一个很好的教程,介绍如何使用Runtime.exec When Runtime.exec() won't

我们的想法是,您需要为Runtime.exec创建的流程使用标准输入,输出和错误,并且我提到的网站是完美的。

答案 1 :(得分:0)

你需要:

  1. 从生成的进程中消耗stdout / stderr。请注意,您必须在单独的线程中执行此操作,以避免在等待您阅读时阻止进程。有关详细信息,请参阅this answer
  2. 使用Process.waitFor()收集衍生过程的退出代码
  3. 不相关:查看Files.copy()以执行跨平台文件复制操作