Dwa obiekty ProcessBuilder i zliczanie pakietó

0

Cześć,

Potrzebuje pomocy z pewnym zagadnieniem.
Potrzebuje za pomocą javy wywołać następującą komende: tcpdump -r test.cap | wc -l
W test.cap znajdują się oczywiście złapane pakiety, a wc -l ma za zadanie zliczyć ich ilość.
W pierwszej chwili pomyślałem o zapisaniu tego w ten sposób:

ProcessBuilder tcpdump = new ProcessBuilder("tcpdump", "-r", file, "|", "wc", "-l");
Process proc = tcpdump.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String res = reader.readLine();

Oczywiście ta opcja nie zadziałała. Przyszło olśnienie że "wc" jest przecież kolejnym procesem.
Niestety mam problem ze znalezieniem odpowiedzi na następujące pytanie.
Jak w javie wywołać proces i jego wynik przekazać do kolejnego?

Z góry dziękuję za wszelką pomoc.

1

W tym wypadku wc porzebne jest jak dziura w moście, masz przecież Jave!
Odpal samego tcpdumpa (ale zastanów się jak ty ten process zakończysz, możesz sprawdzić czy można wysłać np. SIGTERM do niego np. kill $PID).
Może warto ustawić opcję jak dużo danych ma tcpdump zebrać? Jest na to swtich.

Czytaj wyjście programu za pomocą api process buildera: https://stackoverflow.com/a/37438418 i po prostu policz linie w Javie...

Inna opcja to odplaić bash'a i do niego przekazać całą komendę z PIpem: https://stackoverflow.com/a/5928316

0

Pomysł z liczeniem lini... Tak prosty że aż na to nie wpadłem :D
Ograniczenie liczby pakietów nie było możliwe, rezultat w postaci .pcap jest pobierany i nie mam absolutnie żadnego wpływu na jego wielkość.

4

Jeśli musisz tak zrobić to nie jest to trudne specjalnie ale trzeba uważać na jeden mały szkopuł jakim jest rozmiar bufora wyjściowego w systemie. Nie możesz najpierw odpalić jeden proces, poczekać aż się skończy a potem dopiero odczytać wyjście, bo proces będzie wisiał jak skończy sie bufor.

Generalnie po prostu odpalasz dwa procesy, bierzesz output stream jednego, inuput stream drugiego i przepisujesz z jednego na drugi.

InputStream inputStream = p1.getInputStream();
OutputStream outputStream = p2.getOutputStream();
inputStream.transferTo(outputStream);

1 użytkowników online, w tym zalogowanych: 0, gości: 1