Функции perl для получения информации о сети
Функции: endhostent, endnetent, endprotoent, endservent, gethostbyaddr, gethostbyname, gethostent, getnetbyaddr, getnetbyname, getnetent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, sethostent, setnetent, setprotoent, setservent. Примеры кода.
Функции для получения информации о хостах
endhostent
|
1 |
endhostent |
Закрытие файла хостов после завершения обработки его содержимого.
gethostbyaddr
|
1 |
gethostbyaddr(ADDR, ADDRTYPE); |
Возвращает описание интернет-узла по заданному сетевому адресу.
ADDR — это упакованный бинарный сетевой адрес, ADDRTYPE — тип, семейство протоколов.
Информацию о хосте получает от сервера имен или из файла /etc/hosts .
Формат вызова:
|
1 |
($name, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($address, $addrtype); |
Просматриваем /etc/hosts на указанном сервере:
|
1 2 3 4 5 6 7 8 9 |
fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 127.0.0.1 localhost.localdomain localhost # Auto-generated hostname. Please do not remove this comment. 179.20.224.220 179-20-224-220.ovz.vps.regruhosting.ru 179-20-224-220 ::1 localhost ip6-localhost ip6-loopback |
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 |
use strict; use Socket; my ($name, $aliases, $addrtype, $length, @addrs) = gethostbyaddr(inet_aton("179.20.224.220"), PF_INET); print "NAME ".$name."\n"; print "ALIASES ".$aliases."\n"; print "ADDRTYPE ".$addrtype."\n"; print "LENGHT ".$length."\n"; print inet_ntoa($addrs[0])." ".scalar(@addrs)."\n"; |
Вывод:
|
1 2 3 4 5 6 |
# perl net1.pl NAME 179-20-224-220.ovz.vps.regruhosting.ru ALIASES 179-20-224-220 ADDRTYPE 2 LENGHT 4 179.20.224.220 1 |
gethostbyname
|
1 |
gethostbyname(NAME); |
|
1 |
($name, $aliases, $addtype, $length, @addrs) = gethostbyname($remote_hostname); |
Возвращает описание интернет-узла по указанному имени хоста.
Возвращается информация, полученная от сервера имен или произвольные поля из строки в /etc/hosts . Если нет доступа к серверу имен, то будет просматриваться локальный /etc/hosts .
Одному имени хоста может соответствовать несколько ip-адресов. Особенно часто это встречается в высоконагруженных проектах, где происходит распределение нагрузки по разным серверам.
Формат возвращаемых данных такой же, как для функции gethostbyaddr().
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
use strict; use Socket; my ($name, $aliases, $addrtype, $length, @addrs) = gethostbyname("yandex.ru"); print "NAME ".$name."\n"; print "ALIASES ".$aliases."\n"; print "ADDRTUPE ".$addrtype."\n"; print "LENGHT ".$length."\n"; foreach (@addrs) { print inet_ntoa($_)."\n"; } |
Вывод:
|
1 2 3 4 5 6 7 8 |
# perl net2.pl NAME yandex.ru ALIASES ADDRTUPE 2 LENGHT 4 93.158.134.11 213.180.204.11 213.180.193.11 |
gethostent
|
1 |
gethostent |
Функция осуществляет итерацию по файлу /etc/hosts и возвращает по одной записи. Данные возвращаются в том же формате, что и для функции gethostbyaddr().
Функция gethostent() может быть не реализована для некоторых видов операционных систем, так что, скрипты, которые содержат ее — не могут считаться переносимыми.
|
1 2 3 4 5 6 7 8 9 10 |
# less /etc/hosts fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 127.0.0.1 localhost.localdomain localhost # Auto-generated hostname. Please do not remove this comment. 179.20.224.220 179-20-224-220.ovz.vps.regruhosting.ru 179-20-224-220 ::1 localhost ip6-localhost ip6-loopback |
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use strict; use Socket; while (my ($name, $aliases, $addrtype, $length, @addrs) = gethostent) { print "NAME ".$name."\n"; print "ALIASES ".$aliases."\n"; print "ADDRTUPE ".$addrtype."\n"; print "LENGHT ".$length."\n"; foreach (@addrs) { print inet_ntoa($_)."\n"; } } |
Вывод:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# perl net3.pl NAME localhost.localdomain ALIASES localhost ADDRTUPE 2 LENGHT 4 127.0.0.1 NAME 179-20-224-220.ovz.vps.regruhosting.ru ALIASES 179-20-224-220 ADDRTUPE 2 LENGHT 4 179.20.224.220 NAME localhost ALIASES ip6-localhost ip6-loopback ADDRTUPE 2 LENGHT 4 127.0.0.1 |
sethostent
|
1 |
sethostent(STAYOPEN); |
Позиционирование файла хостов на первую запись. Последующий вызов функции gethostent() начинает его обработку с первой записи.
Если STAYOPEN указан как true, то файл не будет закрываться между вызовами gethostbyname() и
gethostbyaddr().
Функции для получения информации о сетях
endnetent
|
1 |
endnetent |
Закрытие файла сетей после завершения обработки его содержимого.
getnetbyaddr
|
1 |
getnetbyaddr(ADDR, ADDRTYPE); |
Получение записи из файла сетей о сети с заданным адресом и типом.
|
1 |
($name, $aliases, $addrstype, $net) = getnetbyaddr($netnumber, $type); |
В скалярном контексте функция вернет только сетевое имя.
Пример:
|
1 2 3 4 5 6 7 8 9 |
use strict; use Socket; my ($name, $aliases, $addrstype, $net) = getnetbyaddr(0, PF_INET); print $name."\n"; print $aliases."\n"; print $addrstype."\n"; print $net."\n"; |
Вывод:
|
1 2 3 4 5 |
# perl net4.pl default 2 0 |
getnetbyname
|
1 |
getnetbyname(NAME); |
Получение записи из файла сетей о сети с заданным сетевым именем.
|
1 |
($name, $aliases, $addrstype, $net) = getnetbyname($netname); |
Пример:
|
1 2 3 4 5 6 7 8 |
use strict; my ($name, $aliases, $addrstype, $net) = getnetbyname("link-local"); print $name."\n"; print $aliases."\n"; print $addrstype."\n"; print $net."\n"; |
Вывод:
|
1 2 3 4 5 |
# perl net4.pl link-local 2 2851995648 |
getnetent
|
1 |
getnetent |
Возвращает следующую запись файла сетей при очередном вызове.
Функция выполняет итерацию по строкам файла /etc/networks. В списковом контексте возвращает значения:
|
1 |
($name, $aliases, $addrtype, $net) = getnetent(); |
В скалярном контексте возвращает только имя сети.
|
1 2 3 4 |
# less /etc/networks default 0.0.0.0 loopback 127.0.0.0 link-local 169.254.0.0 |
|
1 |
# man -S 5 networks |
Пример:
|
1 2 3 4 5 6 |
while (my ($name, $aliases, $addrtype, $net) = getnetent) { print "NAME ".$name."\n"; print "ALIASES ".$aliases."\n"; print "ADDRTYPE ".$addrtype."\n"; print "NET ".$net."\n\n"; } |
где $name — официальное имя сети, $addrtype — тип сетевого адреса, $net — номер сети в сетевом порядке байтов.
Вывод:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# perl net3.pl NAME default ALIASES ADDRTYPE 2 NET 0 NAME loopback ALIASES ADDRTYPE 2 NET 2130706432 NAME link-local ALIASES ADDRTYPE 2 NET 2851995648 |
setnetent
|
1 |
setnetent(STAYOPEN); |
Позиционирование файла сетей на первую запись. Последующий вызов функции getnetent() начинает его обработку с первой записи.
Если STAYOPEN задан true, то файл не будет закрываться между вызовами getnetbyname() и getnetbyaddr().
Функции для получения информации о протоколах
endprotoent
|
1 |
endprotoent |
Закрытие файла протоколов после завершения обработки его содержимого.
getprotobyname
|
1 |
getnetbyname(NAME); |
Получение записи из файла протоколов /etc/protocols о протоколе с заданным именем.
В скалярном контексте возвращает только номер протокола. Списковый контекст:
|
1 |
($name, $aliases, $protocol_number) = getprotobyname($proto_name); |
Пример:
|
1 2 3 4 5 6 7 |
use strict; my ($name, $aliases, $protocol_number) = getprotobyname("tcp"); print $name."\n"; print $aliases."\n"; print $protocol_number."\n"; |
Вывод:
|
1 2 3 4 |
# perl net4.pl tcp TCP 6 |
getprotobynumber
|
1 |
getprotobynumber(NUMBER); |
Получение записи из файла протоколов /etc/protocols о протоколе с заданным номером. В списковом контексте функция возвращает:
|
1 |
($name, $aliases, $protocol_number) = getprotobynumber($number); |
В скалярном контексте функция вернет только название протокола.
|
1 2 3 4 5 6 7 |
use strict; my ($name, $aliases, $protocol_number) = getprotobynumber(1); print $name."\n"; print $aliases."\n"; print $protocol_number."\n"; |
Вывод:
|
1 2 3 4 |
# perl net4.pl icmp ICMP 1 |
getprotoent
|
1 |
getprotoent |
Возвращает следующую запись файла протоколов при очередном вызове.
|
1 2 3 4 5 6 7 8 9 10 |
# less /etc/protocols ip 0 IP # internet protocol, pseudo protocol number icmp 1 ICMP # internet control message protocol ... tcp 6 TCP # transmission control protocol ... udp 17 UDP # user datagram protocol ... ipv6 41 IPv6 # Internet Protocol, version 6 ... |
Функция осуществляет итерацию файла /etc/protocols . В списковом контексте возвращает:
|
1 |
($name, $aliases, $protocolnumber) = getprotoent(); |
В скалярном контексте возвращает только имя протокола.
Пример:
|
1 2 3 4 5 6 7 |
use strict; while (my ($name, $aliases, $protocolnumber) = getprotoent) { print "NAME ".$name."\n"; print "ALIASES ".$aliases."\n"; print "PROTO ".$protocolnumber."\n\n"; } |
Вывод:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# perl net3.pl NAME ip ALIASES IP PROTO 0 NAME icmp ALIASES ICMP PROTO 1 NAME igmp ALIASES IGMP PROTO 2 ... |
setprotoent
|
1 |
setprotoent(STAYOPEN); |
Позиционирование файла протоколов на первую запись. Последующий вызов функции getprotoent() начинает его обработку с первой записи.
Если STAYOPEN равен true, то файл не будет закрываться между вызовами getprotobyname() и
getprotobyaddr().
Функции для получения информации о сервисах
endservent
|
1 |
endservent |
Закрытие файла сервисов после завершения обработки его содержимого.
getservbyname
|
1 |
getservbyname(NAME, PROTO); |
Получение записи из файла /etc/services о сервисе с заданным именем и протоколом.
В списковом контексте функция возвращает:
|
1 |
($name, $aliases, $port_number, $protocol_name) = getservbyname($serv_name, $proto_name); |
В скалярном контексте getservbyname() вернет только номер порта.
Пример:
|
1 2 3 4 5 6 7 8 |
use strict; my ($name, $aliases, $port_number, $protocol_name) = getservbyname("postgresql", "tcp"); print $name."\n"; print $aliases."\n"; print $port_number."\n"; print $protocol_name."\n"; |
Вывод:
|
1 2 3 4 5 |
# perl net4.pl postgresql postgres 5432 tcp |
getservbyport
|
1 |
getservbyport(PORT, PROTO); |
Получение записи из файла /etc/services о сервисе с заданным номером порта и протоколом. В скалярном контексте getservbyport() вернет только имя сервиса. В списковом контексте возвращает:
|
1 |
($name, $aliases, $port_number, $protocol_name) = getservbyport($port, $protocol); |
Пример:
|
1 2 3 4 5 6 7 8 |
use strict; my ($name, $aliases, $port_number, $protocol_name) = getservbyport(80, "udp"); print $name."\n"; print $aliases."\n"; print $port_number."\n"; print $protocol_name."\n"; |
Вывод:
|
1 2 3 4 5 |
# perl net4.pl http 80 udp |
getservent
|
1 |
getservent |
Возвращает следующую запись файла сервисов /etc/services при очередном вызове.
|
1 2 3 4 5 6 7 8 9 10 |
# less /etc/services tcpmux 1/tcp # TCP port service multiplexer echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null ... http 80/tcp www # WorldWideWeb HTTP http 80/udp # HyperText Transfer Protocol ... |
В списковом контексте функция getservent() возвращает:
|
1 |
($name, $aliases, $port_number, $protocol_name) = getservent(); |
В скалярном контексте getservent() будет возвращать только имя сервиса.
Пример:
|
1 2 3 4 5 6 7 8 |
use strict; while (my ($name, $aliases, $port_number, $protocol_name) = getservent) { print "NAME ".$name."\n"; print "ALIASES ".$aliases."\n"; print "PORT ".$port_number."\n"; print "PROTONAME ".$protocol_name."\n\n"; } |
Вывод:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
NAME tcpmux ALIASES PORT 1 PROTONAME tcp NAME echo ALIASES PORT 7 PROTONAME tcp ... NAME fido ALIASES PORT 60179 PROTONAME tcp |
setservent
|
1 |
setservent |
Позиционирование файла сервисов на первую запись. Последующий вызов функции getservent() начинает его обработку с первой записи.
Если STAYOPEN равен true, то файл не будет закрываться между вызовами getservbyname() и getservbyaddr().
Полезные ссылки
opennet.ru: Библиотечные вызовы getnetent, getnetbyname, getnetbyaddr, setnetent, endnetent
opennet.ru: Библиотечные вызовы getservent, getservbyname, getservbyport, setservent, endservent