Назад | Перейти на главную страницу

Простой способ получить IP-адрес из имени хоста с помощью оболочки Unix

Как проще всего получить 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'
  • Nmap получает из вашей подсети (192.168.1.0 или что-то еще) они адресуют
  • с помощью grep получите только строку с именем хоста, которое вы ищете
  • С sed получить только IP-адрес в круглых скобках