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

12

Какой самый простой способ получить IP-адрес от имени хоста?

Я думал о том, чтобы попробовать pingи разобрать его на выходе. Тем не менее, это не очень приятно и, вероятно, не будет работать одинаково на всех системах.

Я немного искал и нашел решения nslookup, но это не работает для имен хостов в /etc/hosts.

Альберт
источник
Я все еще немного удивляюсь, почему оболочки Unix не считаются языками программирования ...
Альберт
Потому что оболочка традиционно рассматривается как скриптинг, а не программирование;)
Tino

Ответы:

5

Вы можете сделать это с помощью стандартных системных вызовов. Вот пример в 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и т. Д.

простой эфир
источник
Круто, это работает. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Альберт
Очень странно, что этот ответ - некоторый программный код ... :) Выглядит почти как ответ Stackoverflow. На самом деле не относится к Serverfault. Но я все равно приму ответ.
Альберт
@ Альберт: хорошо, чтобы быть справедливым: 1. вопрос был первоначально опубликован на SO и перенесен в SF, и 2. тип данных, который вы ищете, должен быть проанализирован с чем-то ; некоторые считают Perl лучшей формой shell-скрипта: D
Ether
@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino
11

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.) Попробуйте host localhost.
Альберт
serv ~ $ host localhost \n localhost has address 127.0.0.1
Хм, ну не здесь. Мне любопытно, почему это работает для вас. Или почему это не для меня.
Альберт
2
Смотрите мое редактирование - вы можете попробовать resolveip.
Хм, resolveipне установлен по умолчанию на моем Debian.
Альберт
9

Этот древний пост, кажется, имеет много творческих решений.

Если мне нужно убедиться, что к ним также /etc/hostsобращаются, я склонен использовать

getent hosts somehost.com

Это работает, по крайней мере, если `/etc/nsswitch.conf 'был настроен для использования файлов (как обычно).

Янне Пиккарайнен
источник
Хорошо, и работает для IPv6 тоже.
Тино
И не требует установки syslinux!
Клавдиу
Интересно, что для некоторых IP-адресов он ничего ahostsне возвращает, а возвращает многострочную информацию.
Акостадинов
7

Для 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 -

НТН

Tino
источник
Пришел сюда, чтобы дать этот ответ, вместо этого проголосовал за вас.
Не сейчас
4

Почему нет dig +short hostname?

(запрос DNS)

gWaldo
источник
Это не /etc/hostsучитывает.
Янне Пиккарайнен
Предполагается, что DNS является окончательным источником разрешения имен, и если вы используете файл хоста для переопределения, это нормально. Но это переопределение, а не окончательное ...
gWaldo
Я знаю, но оригинальный вопрос хотел / etc / hosts :)
Janne Pikkarainen
конечно же; мое понимание прочитанного не
удалось
3

Ну, мое текущее решение:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
Альберт
источник
это не дает только IP: PING www.l.google.com (72.14.234.104): 56 байт данных
Федерико Клез Каллока
Да, кажется, что sedведет себя немного по-разному в каждой системе. :) Как раздражает. Я немного изменил это, я думаю, что теперь оно должно работать везде.
Альберт
0

На некоторых Unix будет работать следующее:

arp <hostname>

Например, в Mac OS X я получаю это:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
ennuikiller
источник
Ну, он находит запись, но он перечисляет только свой MAC, а не IP. :)
Альберт
Ах, arp -n hostnameпоказывает IP.
Альберт
Только этот способ не работает для серверов вне сети. : P
Альберт
0

Использование pingне так уж и плохо, так как у вас, как правило, нет сильных зависимостей.

Вот функция, которую я использовал в системах Linux:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
Бруно КОФЕ
источник
-1
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-адрес в скобках
Филипп Гачу
источник
2
Немного больше информации о различных переключателях и их использовании добавит к вашему ответу
Dave M
Есть по крайней мере четыре разных причины, почему этот ответ не сработает. Вы делаете предположения о диапазоне IP-адресов, в пределах которых будет найден ответ. Это неэффективно из-за того, что генерирует намного больше сетевого трафика, чем необходимо. Это работает только для IP-адресов, которые отвечают на зонды. Предполагается, что обратный DNS содержит те же сопоставления, что и прямой DNS.
Касперд