Баш сломал трубу с tcpdump - PullRequest
0 голосов
/ 29 апреля 2018

Я использую следующую команду для отправки пингующих IP-адресов в сценарий:

sudo tcpdump -ne -l -i eth0 icmp and icmp[icmptype]=icmp-echo \
  | cut -d " " -f 10 | xargs -L2 ./pong.sh

К сожалению, это дает мне:

tcpdump: Unable to write output: Broken pipe


Чтобы проанализировать мои команды:

  • Вывод пинга из трафика:

    sudo tcpdump -ne -l -i eth0 icmp and icmp[icmptype]=icmp-echo

    Выход:

    11:55:58.812177 IP xxxxxxx > 127.0.0.1: ICMP echo request, id 50776, seq 761, length 64

  • Это получит IP-адреса из вывода tcpdump:

    cut -d " " -f 10 # output: 127.0.0.1

  • Получить вывод для скрипта:

    xargs -L2 ./pong.sh

    Это будет имитировать следующую команду:

    ./pong.sh 127.0.0.1


Странно то, что команды работают отдельно (самостоятельно) ...

Я пытался отладить его, но у меня нет опыта отладки каналов. Я проверил команды, но они кажутся нормальными.

1 Ответ

0 голосов
/ 30 апреля 2018

Казалось бы, здесь вмешивается cut буферизация stdio, то есть замените | xargs ... на | cat в вашей командной строке, чтобы выяснить.

Ниже строки cmdline wfm (направьте трубку прямо к xargs, затем используйте саму оболочку, чтобы получить nth arg), обратите внимание на дополнительные tcpdump args: -c10 (просто ограничить 10pkts, затем показать строки 10/2) и -Q in (только входящие pkts):

$ sudo tcpdump -c 10 -Q in -ne -l -i eth0 icmp and icmp[icmptype]=icmp-echo 2>/dev/null | \
  xargs -L2 sh -c 'echo -n "$9: "; ping -nqc1 $9 | grep rtt' 
192.168.100.132: rtt min/avg/max/mdev = 3.743/3.743/3.743/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 5.863/5.863/5.863/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 6.167/6.167/6.167/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 4.256/4.256/4.256/0.000 ms
192.168.100.132: rtt min/avg/max/mdev = 1.545/1.545/1.545/0.000 ms
$ _
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...