如何在java中的特定目录中执行terminal命令

时间:2013-10-11 07:08:04

标签: java

我正在尝试在特定目录“/ usr / local / freeswitch / bin”中执行originate命令,在bin中我必须通过./fs_cli命令运行可执行文件fs_cli,在fs_cli中我必须执行以下命令

originate loopback/1234/default &bridge(sofia/internal/1789)

它从终端工作正常,可以从bin

执行相同的命令
./fs_cli -x "originate loopback/1234/default &bridge(sofia/internal/1789)"

我尝试了以下java程序来完成上述任务

Process pr = Runtime.getRuntime().exec("./fs_cli -x \"originate loopback/1234/default &bridge(sofia/internal/1789@192.168.0.198)\"");
BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String str = null;
while ((str = br.readLine()) != null) {
    System.out.println(str);
}

我创建了fs_cli的符号链接并放置在当前位置 以上程序显示以下输出

输出

-ERR“发起命令未找到!

就我而言,上面的命令与终端工作正常时,它应该与java相同,所以它显示我错了某处 请帮我解决这个问题。

3 个答案:

答案 0 :(得分:4)

使用ProcessBuilder并提供directory路径

ProcessBuilder pb = new ProcessBuilder(
        "./fs_cli",
        "-x",
        "originate loopback/1234/default &bridge(sofia/internal/1789@192.168.0.198)");
pb.directory(new File("..."));
Process pr = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String str = null;
while ((str = br.readLine()) != null) {
    System.out.println(str);
}

在可能的情况下,您应该将命令参数作为单独的String提供,这会将每个参数作为一个单独的参数传递给进程,并处理那些需要通过引号转义的参数(除非它是期待报价,然后你应该包括它们)

答案 1 :(得分:1)

另一种方式是:

ProcessBuilder processBuilder = new ProcessBuilder( "/bin/bash", "-c", "cd /usr/local/freeswitch/bin && ./fs_cli -x \"originate loopback/1234/default &bridge(sofia/internal/1789)\"" );
processBuilder.start();

答案 2 :(得分:0)

试试这个:

  String command  = "./fs_cli -X \"originate loopback/1235/default &bridge   (sofia/internal/1789@192.168.0.198)\"");  
  Runtime.getRuntime().exec(command);
相关问题