Простий спосіб отримати IP-адресу від імені хоста за допомогою оболонки Unix


12

Який найпростіший спосіб отримати IP-адресу від імені хоста?

Я думав про те, щоб спробувати pingі розібрати його з результату. Однак це не здається приємним і, ймовірно, не працюватиме однаково у всіх системах.

Я трохи пошукав і знайшов рішення nslookup, але це не працює для імен хостів у /etc/hosts.


Мені все ще трохи цікаво, чому оболонки Unix не вважаються мовами програмування ...
Альберт

Оскільки оболонку традиційно сприймають як сценарій, а не програмування;)
Тіно

Відповіді:


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тощо.


Класно, це працює. Особливо perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Альберт

Дуже дивно, що ця відповідь є деяким програмним кодом ... :) Виглядає майже як відповідь Stackoverflow. Насправді не належить до Serverfault. Але я все одно прийму відповідь.
Альберт

@Albert: добре, щоб бути справедливим: 1. питання було розміщено на SO спочатку та перенесено на SF, і 2. тип даних, які ви шукаєте, потрібно щось розібрати ; деякі вважають Perl кращою формою скрипту оболонки: D
Ефір

@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 -

HTH


Прийшов сюди, щоб дати цю відповідь, замість вас проголосували.
Не зараз

4

Чому ні dig +short hostname?

(запит DNS)


Це не /etc/hostsвраховує.
Janne Pikkarainen

DNS повинен бути остаточним джерелом для вирішення імен, і якщо ви використовуєте файл хосту для переопрацювання, це добре. Але це
перебор

Я знаю, але оригінальне питання хотіли / etc / господарі :)
Janne Pikkarainen

досить впевнений; моє розуміння читання провалюється ...
gWaldo

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 байт даних
Federico klez Culloca

Так, здається, що sedповодиться дещо по-різному в кожній системі. :) Як надокучливо. Я трохи його змінив, я думаю, це має працювати всюди зараз.
Альберт

0

У деяких Unice працює наступне:

arp <hostname>

Наприклад, на Mac OS X, я отримую це:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry

Ну, він знаходить запис, але в ньому перераховується лише його 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
Трохи більше інформації про різні перемикачі та про те, чому використовувались, додасть би вашу відповідь
Дейв М

Принаймні чотири різні причини, чому ця відповідь не спрацює. Ви робите припущення щодо діапазону IP-адрес, в межах яких буде знайдена відповідь. Він неефективний через створення набагато більше мережевого трафіку, ніж потрібно. Він працює лише для IP-адрес, які реагують на зонди. Він передбачає, що зворотний DNS містить точно такі ж відображення, як і DNS пересилання.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.