arping без указания интерфейса

// Май 26th, 2011 // advance, console, Network, sh/bash, Tool

Когда на компьютере очень много интерфейсов, очень не удобно искать через какой нужно сделать arping, а на память запомнить все — чаще всего тоже не возможно… Появилась идея написать скрипт, который сам будет выбирать нужный.

#!/bin/sh

SNET=`echo $1 | awk −F. '{printf "%s\\\.%s\\\.%s\\\.",$1,$2,$3}'`
#freeBSD
IF=`ifconfig |grep "$SNET" −B6 | awk −F: '/flags/ { print $1 }'`
#linux
#IF=`ifconfig |grep "$SNET" −B6 | awk '/Link/ { print $1 }'`

arping −c3 −i $IF $1

использовать просто:

./script.sh 10.5.84.24

ВНИМАНИЕ! Есть некоторые ограничения:

1) предполагается, что адреса разбиты по 24й маске (255.255.255.0)

2) при количестве алиасов больше 5ти, на тех адресах, которые были добавлены с после — не будет работать

как работает и откуда ограничения под катом

вывод ifconfig для одного интерфейса во freeBSD:

vlan584: flags=8843 mtu 1500
 inet 10.5.84.2 netmask 0xffffff00 broadcast 10.5.84.255
 ether 00:0a:5e:xx:xx:xx
 media: Ethernet autoselect (1000baseTX )
 status: active
 vlan: 584 parent interface: bge0

вывод ifconfig для одного интерфейса в Linux:

vlan584 Link encap:Ethernet HWaddr 00:19:b9:xx:xx:xx
 inet addr:10.5.84.3 Bcast:10.5.84.255 Mask:255.255.255.0
 UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
 RX packets:80168448 errors:0 dropped:0 overruns:0 frame:0
 TX packets:9715 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0
 RX bytes:115518032465 (107.5 GiB) TX bytes:252593084978 (235.2 GiB)

сразу видно, что отличаются кардинально, поэтому в скрипте и разные методы поиска, но суть такая же.

Разберем скрипт по порядку:

SNET=`echo $1 | awk -F. '{printf "%s\\\.%s\\\.%s\\\.",$1,$2,$3}'`

Назначаем в переменную SNET вывод после выполнения команды, для этого фраза команды помещена в такие « кавычки. echo $1 — выводит в STDOUT первый параметр переданные скрипту, это IP адрес, если в строке команды встречается вертикальная черта, то данные оказавшиеся в STDOUT передаются по конвейеру в следующую команду. Комманда awk очень мощная и быстрая утилита поможет разобрать IP адрес на части разделенные точкой (-F.) и заново собрать первые 3 актета {printf «%s\\\.%s\\\.%s\\\.»,$1,$2,$3}, при этом перед каждой точкой будет стоять обратный слеш \, в строке их 3, потому что слеш является специальным символом требующим изоляции, для чего он сам и применяется. Вывод этой комманды будет «10\.5\.84\.»

IF=`ifconfig |grep "$SNET" -B6 | awk -F: '/flags/ { print $1 }'`

ifconfig выводит конфигурацию всех интерфейсов в системе, с помощью grep отфильтровывает только тот у которого есть адрес выбранный выше и переданный переменной SNET, вот здесь и потребуется слеш перед точкой «\.», т.к. в регулярных выражения символ точка обозначает любой символ, для того что бы выражение воспринимало именно точку его нужно изолировать обратным слешем (иначе может возникнуть неоднозначная ситуация, т.к. по выражению «10.5.8» опознаются строки «10.5.8», «10.5.80», «10.5.81» и т.д.), а ключ -B6 выведет 6 строк выше найденной строки, примерно так:

inet 10.5.53.2 netmask 0xffffff00 broadcast 10.5.83.255
 ether 00:0a:5e:xx:xx:xx
 media: Ethernet autoselect (1000baseTX )
 status: active
 vlan: 583 parent interface: bge0
 vlan584: flags=8843 mtu 1500
 inet 10.5.84.2 netmask 0xffffff00 broadcast 10.5.84.255

вот по этому и ограничение в 6 строк, т.к. следующая строка будет уже содержать имя предыдущего интерфейса и тогда возникнет неоднозначная ситуация. С помощью awk находим строку, которая содержит слово «flags», работает по принципу регулярного выражения, разделим строку разделителем «:», и выведем первую часть, это и будет «vlan584».

Дальше просто подставляем найденный интерфейс и переданный скрипту параметр, т.е. IP:

arping -c3 -i $IF $1

на экране увидите стандартный вывод команды arping:

[rem_lex@home ~/dev]# ./ping_arp.sh 10.5.84.24
 ARPING 10.5.84.24
 60 bytes from 00:0c:31:xx:xx:xx (10.5.84.24): index=0 time=9.734 msec
 60 bytes from 00:0c:31:xx:xx:xx (10.5.84.24): index=1 time=9.941 msec
 60 bytes from 00:0c:31:xx:xx:xx (10.5.84.24): index=2 time=9.937 msec
--- 10.5.84.24 statistics ---
 3 packets transmitted, 3 packets received, 0% unanswered

UPD: добавлена возможность указывать количество пакетов, теперь код такой:

#!/bin/sh

COUNT="$2"
if [ ! "$2" ]; then
    COUNT="3"
fi

SNET=`echo $1 | awk -F. '{printf "%s\\\.%s\\\.%s\\\.",$1,$2,$3}'`
IF=`ifconfig |grep "$SNET" -B6 | awk -F: '/flags/ { print $1 } '`
#arping -c3 -i $IF $1
arping -c $COUNT -i $IF $1

Leave a Reply