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

在java shell上执行Linux命令(mutt)时工作不正常,java,linux,shell,Java,Linux,Shell,我有一种情况,我希望(需要)在执行给定java程序时通过电子邮件发送文件。复制命令在Windows和Linux上都可以正常执行,但是,当在java上执行时,mutt不起作用。生成的命令字符串完美无缺(我当前手动键入打印到控制台的字符串以手动发送电子邮件),但是Runtime.getRuntime.exec()没有正确执行它 if (OS.indexOf("win") >= 0) { // windows cmd

我有一种情况,我希望(需要)在执行给定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");


        }

这是一个关于如何使用
Runtime.exec
的好教程

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

您需要:

  • 从派生的进程中使用stdout/stderr。请注意,您必须在单独的线程中执行此操作,以避免在进程等待您读取时阻塞进程。有关更多详细信息,请参阅
  • 使用
    Process.waitFor()
    收集生成的进程的退出代码

  • 无关:签出以执行跨平台文件复制操作

    很可能您收到了错误,除非您读取了输出,否则您将看不到它。我使用了StreamGoBler,进程以值0(成功)退出,标准输入已被消耗,但我的收件箱中没有收到电子邮件:(尝试替换
    cmd=“echo\”这是消息正文\“| mutt-a \”+工作簿文件名+“\”-s \“消息主题\--”sqlinjection@domain.com“;
    with
    cmd=“bash-ic'echo\”这是消息正文\”“mutt-a \”“workbookFileName+“\”-s \“消息主题\”sqlinjection@domain.com' ";
    基本上是在一个shell中运行整个命令。我曾经遇到过同样的问题。