Помогите пожалуйста, гуглил но ничего подходящего не нашел.
Как определить IP по домену? А потом проверить принадлежит ли он к той или иной сети. Список сетей у меня есть.
По пингу ип определять не подходит. Вообще желательно максимально простое решение, что бы не пришлось пользоваться ни grep, ни sed, ни cut при получении IP. Т.к. мне нужно будет проверить более 4000 адресов на принадлежность к списку сетей.
> Помогите пожалуйста, гуглил но ничего подходящего не нашел.
> Как определить IP по домену?Например, утилитами host, nslookup, dig.
> А потом проверить принадлежит ли он к той или иной сети. Список сетей у меня есть.
> [...] Вообще желательно максимально простое решение, что
> бы не пришлось пользоваться ни grep, ни sed, ни cut при
> получении IP. Т.к. мне нужно будет проверить более 4000 адресов на
> принадлежность к списку сетей.И как вы себе представляете поиск по списку без grep, sed или, скажем, awk?
"Узким местом" в вашей задаче являются вовсе не они, а сетевые утилиты, которые будут
ожидать ответ от серверов, находящихся в интернете.К слову сказать, "более четырех тысяч адресов" - это, извините, тьфу и растереть. Около часа
работы даже не при самом быстром и отзывчивом канале.
Без заморочек именно само определение IP адреса, а сравнение на принадлежность к списку сетям уже выполнил с помощью AWK. Нарыл в интернете может кому полезно будет:
#!/bin/bash
IP=$1
MASK_FILENAME="ip_tasix" #файл со списком подсетей
while read line ; do
ip=$(echo $line | awk -F '/' '{ print $1 }')
mask_digit=$(echo $line | awk -F '/' '{ print $2 }' )
mask_seg1=$(echo $ip | awk -F '.' '{ print $1 }' )
mask_seg2=$(echo $ip | awk -F '.' '{ print $2 }' )
mask_seg3=$(echo $ip | awk -F '.' '{ print $3 }' )
mask_seg4=$(echo $ip | awk -F '.' '{ print $4 }' )ip_seg1=$(echo $IP | awk -F '.' '{ print $1 }' )
ip_seg2=$(echo $IP | awk -F '.' '{ print $2 }' )
ip_seg3=$(echo $IP | awk -F '.' '{ print $3 }' )
ip_seg4=$(echo $IP | awk -F '.' '{ print $4 }' )mask_val=$(( ( ($mask_seg1 << 24) + ($mask_seg2 << 16) + ($mask_seg3 << 8) + $mask_seg4 ) & ~(((1 << (32-$mask_digit)) -1)) ))
ip_val=$(( ( ($ip_seg1 << 24) + ($ip_seg2 << 16) + ($ip_seg3 << 8) + $ip_seg4 ) & ~(((1 << (32-$mask_digit)) -1)) ))
if [ $mask_val -eq $ip_val ] ;then
exit 0
fi
done < $MASK_FILENAME
exit 1
Работает не шибко быстро, но лучше пока ничего нет.Вот к сожалению на bash нет аналога PHP функции gethostbyname(); , пришлось делать костыли через ПЫХ. Работает конечно быстро, но хотелось найти подобное решение но без php.
> Вот к сожалению на bash нет аналога PHP функции gethostbyname();А host, nslookup чем-то не устроили?
Ну и на всякий случай: man 3 gethostbyname. ;)
>> Вот к сожалению на bash нет аналога PHP функции gethostbyname();
> А host, nslookup чем-то не устроили?
> Ну и на всякий случай: man 3 gethostbyname. ;)В это трудно поверить, но почему-то emerge на моём Gentoo отказывается искать данные пакеты, по этому и приходится изобретать велосипед )
>>> Вот к сожалению на bash нет аналога PHP функции gethostbyname();
>> А host, nslookup чем-то не устроили?
>> Ну и на всякий случай: man 3 gethostbyname. ;)
> В это трудно поверить, но почему-то emerge на моём Gentoo отказывается искать
> данные пакеты, по этому и приходится изобретать велосипед )данные программы принадлежать пакету net-dns/bind-tools
чтобы узнать кто кому принадлежит используйте
>>> Вот к сожалению на bash нет аналога PHP функции gethostbyname();
>> А host, nslookup чем-то не устроили?
>> Ну и на всякий случай: man 3 gethostbyname. ;)
> В это трудно поверить, но почему-то emerge на моём Gentoo отказывается искать
> данные пакеты, по этому и приходится изобретать велосипед )открой для себя esearch, eix, equery
>[оверквотинг удален]
> $ip_seg4 ) & ~(((1 << (32-$mask_digit)) -1)) ))
> if [ $mask_val -eq $ip_val ] ;then
> exit 0
> fi
> done < $MASK_FILENAME
> exit 1
> Работает не шибко быстро, но лучше пока ничего нет.
> Вот к сожалению на bash нет аналога PHP функции gethostbyname(); , пришлось
> делать костыли через ПЫХ. Работает конечно быстро, но хотелось найти подобное
> решение но без php.Ну, возможно сильно тормозит из-за слишком большого кол-ва запусков awk. В bash есть такая клёвая переменная, как "IFS", советую попробовать разбить на октеты через неё:
xaionaro@imperium:~$ cat >t.sh
oldIFS="$IFS"
a='1.2.3.4'
IFS='.'
b=($a)
IFS="$oldIFS"echo "${b[0]}-${b[1]}-${b[2]}-${b[3]}"
xaionaro@imperium:~$ chmod +x ./t.sh
xaionaro@imperium:~$ ./t.sh
1-2-3-4