在java shell上执行Linux命令(mutt)时工作不正常
我有一种情况,我希望(需要)在执行给定java程序时通过电子邮件发送文件。复制命令在Windows和Linux上都可以正常执行,但是,当在java上执行时,mutt不起作用。生成的命令字符串完美无缺(我当前手动键入打印到控制台的字符串以手动发送电子邮件),但是Runtime.getRuntime.exec()没有正确执行它在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
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
创建的流程使用标准输入、输出和错误,我提到的站点非常完美。您需要:
Process.waitFor()
收集生成的进程的退出代码无关:签出以执行跨平台文件复制操作很可能您收到了错误,除非您读取了输出,否则您将看不到它。我使用了StreamGoBler,进程以值0(成功)退出,标准输入已被消耗,但我的收件箱中没有收到电子邮件:(尝试替换
cmd=“echo\”这是消息正文\“| mutt-a \”+工作簿文件名+“\”-s \“消息主题\--”sqlinjection@domain.com“;
withcmd=“bash-ic'echo\”这是消息正文\”“mutt-a \”“workbookFileName+“\”-s \“消息主题\”sqlinjection@domain.com' ";
基本上是在一个shell中运行整个命令。我曾经遇到过同样的问题。