【问题标题】:How to execute terminal command in specific directory from java如何从java执行特定目录中的终端命令
【发布时间】:2013-10-11 07:08:03
【问题描述】:

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

【问题讨论】:

  • 为什么不完全路径或者 /usr/local/freeswitch/bin/fs_cli 不起作用?

标签: java


【解决方案1】:

使用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);
}

在可能的情况下,您应该将命令参数作为单独的Strings 提供,这会将每个参数作为单独的参数传递给进程,并为您处理那些需要用引号转义的参数(除非它期望引号,那么无论如何你都应该包含它们)

【讨论】:

  • 非常感谢你,我真的很兴奋。我过去 6 天一直在做这个,现在它已经结束了
【解决方案2】:

另一种方式是:

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();

【讨论】:

  • 非常感谢你,我真的很兴奋。我从过去 6 天开始一​​直在做这个,现在它已经结束了
猜你喜欢
  • 2014-12-15
  • 2021-08-04
  • 2015-08-16
  • 2018-08-21
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多