Modo semplice per ottenere l'indirizzo IP dal nome host utilizzando una shell Unix


12

Qual è il modo più semplice per ottenere l'indirizzo IP da un nome host?

Stavo pensando di provare a pinge analizzarlo dall'output. Tuttavia, ciò non sembra molto bello e probabilmente non funzionerà allo stesso modo su tutti i sistemi.

Ho cercato un po 'in giro e ho trovato soluzioni nslookup, ma non funziona con i nomi host /etc/hosts.


Mi chiedo ancora un po 'perché le shell Unix non sono considerate linguaggi di programmazione ...
Albert

Perché tradizionalmente la shell è vista come script, non programmazione;)
Tino,

Risposte:


5

Puoi farlo con le chiamate di sistema standard. Ecco un esempio in 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);

produce l'output:

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

(Sulla riga di comando, lo stesso script può essere scritto come perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)':)

Puoi farlo in modo simile in altre lingue - vedi la pagina man per le chiamate di sistema su man -s3 gethostbynameecc.


Bene, funziona. Esp., perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'.
Albert,

Molto strano che questa risposta sia un codice di programma ... :) Sembra quasi una risposta StackOverflow. Non appartiene davvero a Serverfault. Ma accetterò comunque la risposta.
Albert,

@Albert: beh per essere onesti: 1. la domanda è stata pubblicata su SO in origine e migrata su SF, e 2. il tipo di dati che stai cercando deve essere analizzato con qualcosa ; alcune persone considerano Perl una forma migliore di script shell: D
Ether

@Altro sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino

11

host <hostname>

Ex:

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

modificare

Su Linux, (e almeno alcune varianti di OS X), potresti essere in grado di utilizzare resolveip, che fa parte del pacchetto del server MySQL:

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

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

Inoltre non funziona. (Per gli host /etc/hosts.) Prova host localhost.
Albert,

serv ~ $ host localhost \n localhost has address 127.0.0.1

Hm, beh, non qui. Sono curioso di sapere perché funzioni per te. O perché non fa per me.
Albert,

2
Vedi la mia modifica - potresti provare resolveip.

Hm, resolveipnon è installato di default sul mio Debian.
Albert,

9

Questo antico post sembra avere molte soluzioni creative.

Se devo assicurarmi di /etc/hostsaccedere anche io, tendo a usarlo

getent hosts somehost.com

Funziona, almeno se `/etc/nsswitch.conf 'è stato configurato per usare i file (come al solito).


Bello, e funziona anche per IPv6.
Tino

E non è necessario installare syslinux!
Claudiu,

È interessante notare che per alcuni IP non restituisce nulla mentre ahostsrestituisce informazioni su più righe.
Akostadinov,

7

Per IPv4 esiste un programma standard che funziona immediatamente usando il resolver incluso / etc / hosts:

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

Fa parte di Debian, installalo con:

apt-get install syslinux

Per protocolli diversi da IPv4 (come IPv6) al momento non conosco uno strumento simile. Aggiornamento: per questo motivo ho appena scritto un piccolo strumento in grado di risolvere anche IPv6:

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

È pensato per un uso della shell rapido e sporco come, gethostipma consente anche IPv6:

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

Può anche essere utilizzato in modo interattivo, ad esempio:

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

HTH


Sono venuto qui per dare questa risposta, invece ti ho votato.
Non ora

4

Perché no dig +short hostname?

(query DNS)


Non tiene /etc/hostsconto.
Janne Pikkarainen,

Il DNS dovrebbe essere una fonte definitiva per la risoluzione dei nomi e se si utilizza il file host per sovrascrivere, va bene. Ma questa è una sostituzione, non definitiva ...
gWaldo

Lo so, ma la domanda originale voleva / etc / hosts :)
Janne Pikkarainen,

abbastanza sicuro; la mia comprensione della lettura fallisce ...
gWaldo

3

Bene, la mia soluzione attuale:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"

questo non fornisce solo l'IP: PING www.l.google.com (72.14.234.104): 56 byte di dati
Federico klez Culloca

Sì, sembra che sedsi comporti in modo leggermente diverso su ciascun sistema. :) Che noioso. L'ho cambiato un po ', penso che dovrebbe funzionare ovunque adesso.
Albert,

0

Su alcuni Unices, funzionerà quanto segue:

arp <hostname>

Ad esempio su Mac OS X, ottengo questo:

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

Bene, trova la voce ma elenca solo il suo MAC, non il suo IP. :)
Albert

Ah, arp -n hostnamemostra l'IP.
Albert,

Solo, in questo modo non funziona per i server esterni alla rete. : P
Albert,

0

L'uso pingnon è poi così male poiché generalmente non si hanno forti dipendenze.

Ecco la funzione che ho usato sui sistemi 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 ottiene dalla tua sottorete (192.168.1.0 o qualsiasi altra cosa) gli indirizzi
  • con grep ottieni solo la riga del nome host che stai cercando
  • Con sed ottieni solo l'indirizzo IP tra parentesi

2
Un po 'più di informazioni sui vari interruttori e perché usato aggiungerebbe alla tua risposta
Dave M

Ci sono almeno quattro diversi motivi per cui questa risposta non funzionerà. Fai ipotesi sull'intervallo di indirizzi IP all'interno del quale verrà trovata la risposta. È inefficiente a causa della produzione di molto più traffico di rete del necessario. Funziona solo per gli indirizzi IP che rispondono alle sonde. Presuppone che il DNS inverso contenga esattamente gli stessi mapping del DNS inoltro.
Kasperd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.