Общий способ передачи вывода от одной команды к другой - это конвейер.
tcpdump | script
Тем не менее, это приведет к script
получить непрерывный поток продукции, по одной строке за один раз. Выходной сигнал от tcpdump
разбивает один пакет на несколько строк, поэтому, если script
предполагает, что он получит один пакет, вам нужно будет каким-то образом проанализировать вывод.
На основе краткого экспериментирования, что-то вроде должно работать:
tcpdump -n dst port 40010 -X |
awk '/^[0-9]/ && $2 != "packets" {
if (p) { print p | "script"; close("script"); } p=$0 }
/^[ \t]/ { p=p "\n" $0 }
END { if(p) print p | "script" }'
Дополнительная причуда, что нажатие Ctrl-C прервет весь трубопровод, так что вы потеряете последние несколько пакетов полностью. Я избегал этого, указав несколько пакетов с -c
, но вы также можете защитить сценарий Awk, запустив его с помощью trap
для блокировки сигналов. Однако на данный момент я, возможно, подумал бы о переходе на Python или что-то в этом роде. Разумеется, включение пакета в script
также поможет.
команда останавливается на 20-24 пакетах ... Где хранится пакет в «скрипте»? – Ratiess
Он считывается со стандартного ввода, по одному пакету за раз. То, что происходит внутри 'script', зависит от вас, действительно. – tripleee
он работает, спасибо большое! – Ratiess