如何从java程序在终端运行命令?

如何从java程序在终端运行命令?,java,linux,terminal,Java,Linux,Terminal,我需要从JAVA程序在Fedora16的终端运行一个命令。我试着用 Runtime.getRuntime().exec("xterm"); 但这只是打开终端,我无法执行任何命令 我也试过: OutputStream out = null; Process proc = new ProcessBuilder("xterm").start(); out = proc.getOutputStream(); out.write("any command".getBytes()); out.f

我需要从JAVA程序在Fedora16的终端运行一个命令。我试着用

Runtime.getRuntime().exec("xterm"); 
但这只是打开终端,我无法执行任何命令

我也试过:

OutputStream out = null;
Process proc = new ProcessBuilder("xterm").start();
out = proc.getOutputStream();  
out.write("any command".getBytes());  
out.flush(); 
但我仍然只能打开终端,但无法运行命令。
关于如何操作有什么想法吗?

您需要使用
bash
可执行文件运行它,如下所示:

Runtime.getRuntime().exec("/bin/bash -c your_command");
更新: 根据建议,建议改为使用:


您实际上不需要从xterm会话运行命令,您可以直接运行它:

String[] arguments = new String[] {"/path/to/executable", "arg0", "arg1", "etc"};
Process proc = new ProcessBuilder(arguments).start();
如果流程以交互方式响应输入流,并且您希望注入值,则执行之前的操作:

OutputStream out = proc.getOutputStream();  
out.write("command\n");  
out.flush();

不要忘记结尾处的“\n”,因为大多数应用程序都会使用它来标识单个命令输入的结尾。

正如其他人所说,您可以在不使用xterm的情况下运行外部程序。但是,如果您希望在终端窗口中运行它,例如让用户与它交互,那么xterm允许您指定要作为参数运行的程序

xterm -e any command
在Java代码中,这变成:

String[] command = { "xterm", "-e", "my", "command", "with", "parameters" };
Runtime.getRuntime().exec(command);
或者,使用ProcessBuilder:

String[] command = { "xterm", "-e", "my", "command", "with", "parameters" };
Process proc = new ProcessBuilder(command).start();

我投票支持卡尔蒂克的答案。运行命令不需要打开终端

比如说,

// file: RunShellCommandFromJava.java
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class RunShellCommandFromJava {

    public static void main(String[] args) {

        String command = "ping -c 3 www.google.com";

        Process proc = Runtime.getRuntime().exec(command);

        // Read the output

        BufferedReader reader =  
              new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String line = "";
        while((line = reader.readLine()) != null) {
            System.out.print(line + "\n");
        }

        proc.waitFor();   

    }
} 
输出:

$ javac RunShellCommandFromJava.java
$ java RunShellCommandFromJava
PING http://google.com (123.125.81.12): 56 data bytes
64 bytes from 123.125.81.12: icmp_seq=0 ttl=59 time=108.771 ms
64 bytes from 123.125.81.12: icmp_seq=1 ttl=59 time=119.601 ms
64 bytes from 123.125.81.12: icmp_seq=2 ttl=59 time=11.004 ms

--- http://google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.004/79.792/119.601/48.841 ms

我不知道为什么,但出于某种原因,“/bin/bash”版本不适合我。 相反,按照给出的示例,更简单的版本可以工作


我知道这个问题已经很老了,但是这里有一个封装ProcessBuilderAPI的方法。

您是否尝试过
Runtime.getRuntime().exec()
您不需要打开
xterm
,这就是打开终端的原因。您应该尝试
sh-s
,您可以使用编写的代码,shell将接受来自流的命令,或者
sh-c
,并且将运行参数中指定的命令。
Runtime.exec()的用法现在不鼓励使用
:应改用ProcessBuilder()使用Runtime.exec()现在不鼓励使用:应改用ProcessBuilder()在中编辑的ProcessBuilder变量。文档中的注释提到ProcessBuilder更倾向于使用“修改的环境”启动流程,但在本例中不使用。无论如何,我的答案的主要补充是包含了如何在xterm中运行命令。但是如果命令执行的结果是冗长的日志,那么这个readLine东西根本不起作用,如何读取它呢?@YashAgrawal你能提供生成冗长日志的命令(或类似的命令)吗,所以我可以再次测试这个程序吗?我不能在这里发布它,因为在为ex:/hadoop…/bin/hdfs jar some.jar/input运行hadoop命令时,它的日志非常长/output@YashAgrawal我只是碰巧遇到了一个问题,这个问题基本上可以处理相同的情况。我想您可能也想检查一下,您能看看它是否有用吗?可执行文件可能采用的任何命令行参数(如果有的话)。
$ javac RunShellCommandFromJava.java
$ java RunShellCommandFromJava
PING http://google.com (123.125.81.12): 56 data bytes
64 bytes from 123.125.81.12: icmp_seq=0 ttl=59 time=108.771 ms
64 bytes from 123.125.81.12: icmp_seq=1 ttl=59 time=119.601 ms
64 bytes from 123.125.81.12: icmp_seq=2 ttl=59 time=11.004 ms

--- http://google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.004/79.792/119.601/48.841 ms
String[] args = new String[] {"ping", "www.google.com"};
Process proc = new ProcessBuilder(args).start();