3

特定のディレクトリ「/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 と同じである必要があります。したがって、どこかで間違っていることを示しています。この問題を解決するのを手伝ってください。

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の として指定する必要があります。これにより、それぞれが個別の引数としてプロセスに渡され、引用符でエスケープする必要がある引数が処理されます (引用符が必要な場合を除き、含める必要があります)。とにかくそれら)

于 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 に答える