2

接続が入ってくると、tcpdump の出力を 1 行ずつ読み取って処理したいと考えています。これまでのところ、Process クラスを使用しています。root 以外のユーザーとしても実行したいので、sudo を構成しました: user1 ALL= NOPASSWD:/usr/sbin/sudo

RHEL 6.4 で実行しています。

私のJavaコードは次のようになります。

    String[] tcpdumpCmd = {"/usr/bin/sudo", "-n", "/usr/sbin/tcpdump", "-i", "eth0", "port 8561"};
    Process p = new ProcessBuilder(tcpdumpCmd).start();
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));

    tcpdumpOut = null;
    tcpdumpLineCnt = 0;
    while ((tcpdumpOut = in.readLine()) != null ) {
        System.out.println(tcpdumpOut);
        tcpdumpLineCnt++;
    }

    System.out.println("Output lines: " + tcpdumpLineCnt+"\nCommand exit code: " + p.exitValue());

コマンドは正常に動作するので、Ctrl-C を押すと出力が表示されるため、何が起こっているのかは明らかです。そのため、中断するまで一種の「バッファリング」を行っています (その時点で残りのコードは実行されないため、RC 部分には到達しません)。

while ループで出力を処理する方法に問題があるか、この方法では実行できないと思います。ですので、どなたかアドバイスをいただけないでしょうか。

4

0 に答える 0