3

我正在尝试在特定目录“/usr/local/freeswitch/bin”中执行发起命令,在 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 相同,所以它表明我在某处错了请帮我解决这个问题。

4

2 回答 2

5

使用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的 s 提供,这会将每个参数作为单独的参数传递给进程,并处理那些需要为您用引号转义的参数(除非它需要引号,那么您应该包括反正他们)

于 2013-10-11T07:10:28.613 回答
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();
于 2013-10-11T07:53:25.990 回答