Как проще всего получить IP-адрес по имени хоста?
Я думал попробовать ping
и проанализируйте его с вывода. Однако это кажется не очень хорошим и, вероятно, не будет работать одинаково во всех системах.
Я немного поискал и нашел решения с nslookup
, но это не работает для имен хостов в /etc/hosts
.
host <hostname>
Пример:
serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211
В Linux (и, по крайней мере, в некоторых вариантах OS X) вы можете использовать resolveip
, который является частью пакета сервера MySQL:
/etc/hosts:
...
127.0.0.1 localhost localhost.localdomain foo
...
serv ~ $ resolveip foo
IP address of foo is 127.0.0.1
У этого древнего поста, кажется, есть много творческих решений.
Если мне нужно также убедиться /etc/hosts
получает доступ, я обычно использую
getent hosts somehost.com
Это работает, по крайней мере, если `/etc/nsswitch.conf 'был настроен на использование файлов (как обычно).
Для IPv4 есть стандартная программа, которая работает "из коробки" с использованием преобразователя, включая / etc / hosts:
host="localhost"
ip="`gethostip -d "$host"`"
Это часть Debian, установите его с помощью:
apt-get install syslinux
Для протоколов, отличных от IPv4 (например, IPv6), я в настоящее время не знаю аналогичного инструмента. Обновить: Из-за этого я просто написал небольшой инструмент, который тоже может разрешать IPv6:
https://github.com/hilbix/misc/blob/master/src/ipof.c
Он предназначен для быстрого и грязного использования оболочки, например gethostip
но также позволяет IPv6:
ip="`ipof -6 -- heise.de`"
Его также можно использовать в интерактивном режиме, например:
ipof -a -d -x -v -h -
HTH
Вы можете сделать это с помощью стандартных системных вызовов. Вот пример на Perl:
use strict; use warnings;
use Socket;
use Data::Dumper;
my @addresses = gethostbyname('google.com');
my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@ips);
производит вывод:
$VAR1 = [
'74.125.127.104',
'74.125.127.103',
'74.125.127.105',
'74.125.127.106',
'74.125.127.147',
'74.125.127.99'
];
(В командной строке тот же сценарий можно записать как: perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)'
)
Вы можете сделать это аналогичным образом на других языках - см. Справочную страницу по системным вызовам на man -s3 gethostbyname
и т.п.
Почему нет dig +short hostname
?
(запрос DNS)
Ну, мое текущее решение:
ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
В некоторых Unices будет работать следующее:
arp <hostname>
Например, в Mac OS X я получаю следующее:
arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
С помощью ping
не так уж и плохо, поскольку обычно у вас нет сильных зависимостей.
Вот функция, которую я использовал в системах Linux:
getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'