Простой сетевой сканер на shell

()

Совсем недавно автора этих строк позвали в одну организацию для перенастройки Wi-Fi-точки D-Link 624 (На самом деле это не важно, но всё же:)). Самая большая проблема заключалась в том, что IP-адреса Wi-Fi-точки не знал никто, даже человек, который её ставил не смог вспомнить ничего, кроме того, что логин и пароль на админке - по умолчанию.

Сбрасывать настройки Wi-Fi-точки было крайне нежелательно. Кроме Wi-Fi-точки в локальной сети организации находился ещё сервер, через который был организован доступ в интернет и около тридцати рабочих станций. IP-адреса сервера и рабочих станций были известны. Оставалось перебрать оставшиеся примерно двести двадцать пять адресов в поисках точки. Понятное дело что вручную это делать не так уж и легко. Потому был написан предлагаемый вниманию читателей скрипт.

Этот скрипт не является полноценным сканером сетей, а просто даёт список адресов, отвечающих на ICMP-запросы (пинги). Листинг скрипта приведён ниже:

#!/bin/sh


NET=${1}

if [ -z ${NET} ]; then

    echo 'Usage:'
    echo '    scan.sh first_3_octets'
    echo ''
    echo 'Example:'
    echo '    scan.sh 192.168.0'
    echo ''

else

    echo "Finding hosts in net ${NET}.0/24"
    echo ''
    echo 'Found hosts:'
    for host in `seq 1 254`; do
        if (ping -c 3 ${NET}.${host} > /dev/null 2> /dev/null) then
            echo ${NET}.${host}
        fi
    done

fi

Этот текст нужно сохранить в файл scan.sh и сделать его исполняемым:

chmod +x scan.sh

Если запустить скрипт без параметров, то будет показана краткая информация об использовании. Для поиска же адресов нужно передать первым параметром первые три октета адресов в локально сети. Например в одной организации этот скрипт был запущен командой:

./scan.sh 192.168.111

Вывод выглядел вот так:

Finding hosts in net 192.168.111.0/24

Found hosts:
192.168.111.6
192.168.111.13
192.168.111.21
192.168.111.33
192.168.111.54
192.168.111.55
192.168.111.63
192.168.111.64
192.168.111.65
192.168.111.77
192.168.111.87
192.168.111.89
192.168.111.137
192.168.111.193
192.168.111.201
192.168.111.219
192.168.111.222
192.168.111.246
192.168.111.248
192.168.111.251
192.168.111.252
192.168.111.253
192.168.111.254

Выбрать из полученного списка нужный адрес заметно проще, чем из всех возможных двухсот пятидесяти четырёх адресов.

Приятной работы!

Ключевые слова: sh, net, scan.

Комментарии:

Bull-Dog 2008-05-31 20:22:15 (#)

аналогичную функциональность по моему имеет nmap...
Если не прав поправьте.

MooSE 2008-05-31 20:46:31 (#)

имеет. и гораздо большую. но зачем гвозди микроскопом забивать? ставить nmap или писать несложный скрипт? я выбрал скрипт:)

shurick 2008-05-31 23:50:42 (#)

модифицированный вариант - запросы распараллелены,
чтобы не ждать слишком долго.

#!/bin/sh

function onehost()
{
host=$1;
if (ping -c 3 ${NET}.${host} > /dev/null 2> /dev/null) then
echo "${NET}.${host}"
fi
}

NET=${1}

if [ -z ${NET} ]; then

echo 'Usage:'
echo ' scan.sh first_3_octets'
echo ''
echo 'Example:'
echo ' scan.sh 192.168.0'
echo ''

else

echo "Finding hosts in net ${NET}.0/24"
echo ''
echo 'Found hosts:'
for host in `seq 1 254`; do
onehost $host&
done
fi

sleep 10

MooSE 2008-06-01 01:14:06 (#)

shurick, хм.... прикольно... А если хочется ещё и рассортировать списочек потом?:)

shurick 2008-06-02 01:18:18 (#)

#!/bin/sh

function onehost()
{
host=$1;
if (ping -c 3 ${NET}.${host} > /dev/null 2> /dev/null) then
echo "${NET}.${host}"
fi
}

NET=${1}

if [ -z ${NET} ]; then

echo 'Usage:'
echo ' scan.sh first_3_octets'
echo ''
echo 'Example:'
echo ' scan.sh 192.168.0'
echo ''

else

echo "Finding hosts in net ${NET}.0/24"
echo ''
echo 'Found hosts:'
echo > $TMPDIR/scan.sh.hosts
for host in `seq -w 1 254`; do
onehost $host | tee -a $TMPDIR/scan.sh.hosts &
done
fi

sleep 10

echo "SORTED:"
sort < $TMPDIR/scan.sh.hosts

vitus 2008-06-09 15:07:13 (#)

Вариант, который в статье, работает медленно, но верно. А приведенный в предыдущем комментарии у меня почему-то половину адресов определил неверно :-(

MooSE 2008-06-09 19:02:46 (#)

Что именно не верно определяет? Определяет что-то лишнее или чего не находит?

vitus 2008-06-11 08:10:48 (#)

В сети - четыре устройства. 192.168.0.1, 192.168.0.4 - определились верно. Вместо 192.168.0.14 и 192.168.0.38 пишет, что есть 192.168.0.16 и 192.168.0.46.

MooSE 2008-06-11 13:34:45 (#)

хм... распараллеливание глючит:)

тут уж не знаю. тот скрипт писал не я:)

Svolotch 2008-06-25 23:05:32 (#)

это... я кашно учусь... а бродкастом всех пнуть низя?

MooSE 2008-06-26 02:46:45 (#)

Svolotch, я потом уже подумал об этом. Ответ простой: мусора больно много.

Вон у меня в офисе за первые несколько секунд смотри чего навалилось:

# ping -b 192.168.111.255
WARNING: pinging broadcast address
PING 192.168.111.255 (192.168.111.255) 56(84) bytes of data.
64 bytes from 192.168.111.33: icmp_seq=1 ttl=64 time=0.373 ms
64 bytes from 192.168.111.63: icmp_seq=1 ttl=64 time=0.406 ms (DUP!)
64 bytes from 91.144.140.75: icmp_seq=1 ttl=255 time=0.830 ms (DUP!)
64 bytes from 192.168.111.253: icmp_seq=1 ttl=255 time=0.878 ms (DUP!)
64 bytes from 192.168.111.65: icmp_seq=1 ttl=255 time=1.62 ms (DUP!)
64 bytes from 192.168.111.252: icmp_seq=1 ttl=255 time=3.93 ms (DUP!)
64 bytes from 192.168.111.55: icmp_seq=1 ttl=64 time=15.9 ms (DUP!)
64 bytes from 192.168.111.253: icmp_seq=2 ttl=255 time=0.271 ms
64 bytes from 192.168.111.33: icmp_seq=2 ttl=64 time=0.294 ms (DUP!)
64 bytes from 192.168.111.63: icmp_seq=2 ttl=64 time=0.318 ms (DUP!)
64 bytes from 192.168.111.65: icmp_seq=2 ttl=255 time=0.574 ms (DUP!)
64 bytes from 192.168.111.254: icmp_seq=2 ttl=255 time=0.595 ms (DUP!)
64 bytes from 91.144.140.75: icmp_seq=2 ttl=255 time=0.686 ms (DUP!)
64 bytes from 192.168.111.252: icmp_seq=2 ttl=255 time=0.698 ms (DUP!)
64 bytes from 192.168.111.55: icmp_seq=2 ttl=64 time=14.3 ms (DUP!)

--- 192.168.111.255 ping statistics ---
2 packets transmitted, 2 received, +13 duplicates, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.271/2.781/15.901/4.928 ms
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE