接続が入ってくると、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 ループで出力を処理する方法に問題があるか、この方法では実行できないと思います。ですので、どなたかアドバイスをいただけないでしょうか。