Dwa obiekty ProcessBuilder i zliczanie pakietó

Dwa obiekty ProcessBuilder i zliczanie pakietó
NU
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:43
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:

Kopiuj
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.

99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
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


Holy sh*t, with every month serenityos.org gets better & better...
edytowany 1x, ostatnio: 99xmarcin
NU
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:43
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ść.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.

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

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.