2015-12-11 2 views
3

Я хотел бы подсчитать количество входящих пакетов в сетевом интерфейсе (например, eth0) в течение определенного периода времени (до 5 минут после выполнения сценария), как это сделать через оболочку или скрипт python? какой из них более точным?Подсчет входящих пакетов по определенному сетевому интерфейсу

Я знаю сетевые инструменты, такие как iptraf, но я хочу, чтобы это выполнялось через скрипт и предпочтительно печатало подсчитанное значение на экране или в файл.

+2

Я думаю, вы можете использовать '/ sys/class/net/eth0/statistics/rx_packets'. он содержит только число, поэтому вам просто нужно проверить его дважды и вычесть – Duffydake

+0

@ Duffydake Учитывая указанную проблему, это должен быть ответ. Другие ответы, хотя и действительны, наверняка переполнены для запроса. – msw

ответ

2

Если вы используете Линукс оболочку, вы можете использовать tcpdump, чтобы выполнить эту работу. Большинство команд, используемых в оболочке, предварительно установлены в большинстве дистрибутивов Linux.

#!/bin/sh 
# # # Run this as sudo 
# # # Pass an argument of your IP address 
# # $ Usage: sudo ./<nameOfTheScript> <IPofYourMachine> 
# Parameters 
captureTime=300 


# Capture packets for X Seconds 
tcpdump -i eth0 dst host $1 >> /dev/null 2> out & 
pid=$! 
sleep $captureTime 
kill $pid 

# Extract relevant data 
cat out | tail -2 | head -1 | cut -d " " -f 1 

# Cleaning up! 
rm out 

Оболочка работает tcpdump для 300 секунд и завершает его. tcpdump выводит данные, которые вам требуются, stderr. Это было бы причиной перенаправления этого потока в файл (2> out). Последняя команда оболочки извлекает данные, которые мы хотим, из полного сообщения, которое выбрано из tcpdump. Он должен быть запущен как sudo! Также не забудьте изменить интерфейс прослушивания по мере необходимости.

Если до сих пор неясно, почему я сделал то, что сделал, дайте мне знать!

+1

'tcpdump -i eth0' также будет захватывать исходящие пакеты. Вы должны добавить 'ip dst $ Ipaddr' или эквивалент, чтобы убедиться, что у вас есть только входящие пакеты – Duffydake

+0

Да, я подумал об этом, но пропустил его при написании скрипта! В любом случае редактирование должно возникнуть. – Harsh

+0

Большое спасибо, он работает для меня как шарм :-) Есть только одна вещь, для некоторых сгенерированных трафиков кажется, что она не работает должным образом (например, 5 Гбит/с или выше). Я не получаю никакого точного значения, как я могу это исправить? –

2

Вы можете использовать /sys/class/net/INTERFACE/statistics/rx_packets, если вы используете ядро ​​Linux (я не знаю, о BSD, ... ядра)

интерфейс capture.sh time_in_seconds

#!/bin/sh 
pcksFile="/sys/class/net/$1/statistics/rx_packets" 
nbPcks=`cat $pcksFile` 
sleep $2 
echo $(expr `cat $pcksFile` - $nbPcks) 

Выход:

$ ./capture.sh eth0 2 
7 
+0

Это дает мне ошибку «разрешенное разрешение», хотя я являюсь корнем на машине, попробовал «sudo» и получил «команда не найдена» для него ... chmod + x делается в файле, результат все равно тот же , –

+0

FYI it's Debian 3.16.7 –

+0

Я пробовал на debian 3.15.9, и он отлично работает даже с «простым» пользователем (root/sudo не нужен): 'touch capture.sh',' nano capture.sh' скопируйте/вставьте скрипт 'chmod + x capture.sh', а затем' ./capture.sh eth0 10'. Мое разрешение файла rx_packets - '-r-r-r -' по умолчанию – Duffydake

Смежные вопросы