我正在尝试在特定目录“/ 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相同,所以它显示我错了某处 请帮我解决这个问题。
答案 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);