Łatwy sposób na uzyskanie adresu IP z nazwy hosta za pomocą powłoki Unix

12

Jaki jest najłatwiejszy sposób na uzyskanie adresu IP z nazwy hosta?

Myślałem o wypróbowaniu pingi przeanalizowaniu go z wyniku. Nie wydaje się to jednak zbyt przyjemne i prawdopodobnie nie będzie działać w ten sam sposób na wszystkich systemach.

Przeszukałem trochę i znalazłem rozwiązania nslookup, ale to nie działa dla nazw hostów w /etc/hosts.

Albert
źródło
Nadal zastanawiam się trochę, dlaczego powłoki uniksowe nie są uważane za języki programowania ...
Albert,
Ponieważ powłoka tradycyjnie jest postrzegana jako skrypt, a nie programowanie;)
Tino

Odpowiedzi:

5

Możesz to zrobić za pomocą standardowych wywołań systemowych. Oto przykład w Perlu:

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);

daje wynik:

$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'
        ];

(W wierszu polecenia ten sam skrypt można zapisać jako perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)':)

Możesz to zrobić podobnie w innych językach - patrz strona podręcznika systemowego dla wywołań systemowych w man -s3 gethostbynameitp.

Eter
źródło
Fajnie, to działa. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert,
Bardzo dziwne, że ta odpowiedź to jakiś kod programu ... :) Wygląda prawie jak odpowiedź Stackoverflow. Naprawdę nie należy do błędu serwera. Ale i tak zaakceptuję odpowiedź.
Albert,
@Albert: trzeba być uczciwym: 1. pytanie zostało pierwotnie opublikowane w SO i przeniesione do SF, oraz 2. typ danych, których szukasz, musi zostać z czymś przeanalizowany ; niektórzy uważają Perla za lepszą formę skryptu powłoki: D
Ether
@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino
11

host <hostname>

Dawny:

serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211

Edytować

W systemie Linux (a przynajmniej niektóre warianty OS X) możesz być w stanie korzystać z niego resolveip, który jest częścią pakietu serwera MySQL:

/etc/hosts:
 ...
 127.0.0.1     localhost localhost.localdomain foo
 ...

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1
Bursztyn
źródło
Też nie działa. (Dla hostów w /etc/hosts.) Spróbuj host localhost.
Albert,
serv ~ $ host localhost \n localhost has address 127.0.0.1
Hm, cóż, nie tutaj. Jestem ciekawy, dlaczego to dla ciebie działa. Albo dlaczego tak nie jest dla mnie.
Albert,
2
Zobacz moją edycję - możesz spróbować resolveip.
Hm, resolveipnie jest domyślnie instalowany na moim Debianie.
Albert,
9

Ten starożytny post wydaje się mieć wiele kreatywnych rozwiązań.

Jeśli muszę się upewnić, że również /etc/hostsuzyskam dostęp, zwykle używam

getent hosts somehost.com

Działa to, przynajmniej jeśli `/etc/nsswitch.conf 'został skonfigurowany do używania plików (jak zwykle jest).

Janne Pikkarainen
źródło
Ładne i działa również dla IPv6.
Tino
I nie wymaga instalacji syslinux!
Claudiu
Ciekawe, że w przypadku niektórych adresów IP nic ahostsnie zwraca, podczas gdy zwraca informacje o wielu wierszach.
akostadinov
7

W przypadku IPv4 istnieje standardowy program, który działa od razu przy użyciu resolvera, w tym / etc / hosts:

host="localhost"
ip="`gethostip -d "$host"`"

Jest częścią Debiana, zainstaluj go z:

apt-get install syslinux

W przypadku protokołów innych niż IPv4 (takich jak IPv6) obecnie nie znam podobnego narzędzia. Aktualizacja: Z tego powodu właśnie napisałem małe narzędzie, które jest również w stanie rozwiązać IPv6:

https://github.com/hilbix/misc/blob/master/src/ipof.c

Uważany jest za szybkie i brudne użycie powłoki, takie jak, gethostipale zezwala również na IPv6:

ip="`ipof -6 -- heise.de`"

Można go również używać interaktywnie, na przykład:

ipof -a -d -x -v -h -

HTH

Tino
źródło
Przybyłem tutaj, aby udzielić tej odpowiedzi, zamiast tego głosowałem za tobą.
Nie teraz,
4

Dlaczego nie dig +short hostname?

(zapytanie DNS)

gWaldo
źródło
To nie bierze /etc/hostspod uwagę.
Janne Pikkarainen
DNS powinien być ostatecznym źródłem rozpoznawania nazw, a jeśli użyjesz pliku hosta do zastąpienia, to w porządku. Ale to przesłonięcie, a nie ostateczne ...
gWaldo,
Wiem, ale pierwotne pytanie chciał / etc / hosts :)
Janne Pikkarainen
na pewno; moje czytanie ze zrozumieniem nie powiodło się ...
gWaldo
3

Moje obecne rozwiązanie:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
Albert
źródło
nie daje to tylko adresu IP: PING www.l.google.com (72.14.234.104): 56 bajtów danych
Federico klez Culloca
Tak, wygląda na to, że sedzachowuje się nieco inaczej w każdym systemie. :) Jak denerwujące. Trochę to zmieniłem, myślę, że teraz powinno działać wszędzie.
Albert,
0

W przypadku niektórych Unices następujące funkcje będą działać:

arp <hostname>

Na przykład w systemie Mac OS X otrzymuję to:

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
ennuikiller
źródło
Cóż, znajduje wpis, ale wyświetla tylko jego MAC, a nie IP. :)
Albert,
Ach, arp -n hostnamepokazuje adres IP.
Albert,
Tylko ten sposób nie działa na serwerach poza siecią. : P
Albert,
0

Używanie pingnie jest takie złe, ponieważ generalnie nie masz żadnych silnych zależności.

Oto funkcja, której użyłem w systemach Linux:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }
Bruno BEAUFILS
źródło
-1
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
  • Nmap pobiera z twojej podsieci (192.168.1.0 lub cokolwiek innego) adresy
  • z grep otrzymujesz tylko wiersz nazwy hosta, którego szukasz
  • Z sed uzyskaj tylko adres IP w nawiasach
Philippe Gachoud
źródło
2
Trochę więcej informacji na temat różnych przełączników i dlaczego użyłby, aby dodać do twojej odpowiedzi
Dave M
Istnieją co najmniej cztery różne powody, dla których ta odpowiedź nie zadziała. Przyjmujesz założenia dotyczące zakresu adresów IP, w których można znaleźć odpowiedź. Jest nieefektywny ze względu na generowanie znacznie większego ruchu sieciowego niż jest to konieczne. Działa tylko w przypadku adresów IP, które reagują na sondy. Zakłada, że ​​zwrotny DNS zawiera dokładnie takie same odwzorowania, jak DNS w przód.
kasperd