Script o strumento per ottenere l'indirizzo IP di un host remoto


4

Voglio impostare una variabile di ambiente con l'indirizzo IP di un dato host remoto. Questa è la soluzione a cui sono arrivato:

export IP=`curl http://network-tools.com/default.asp?host=www.example.com | 
       grep -oE '<br>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | 
       cut -c5-`

Funziona bene ma ho alcune domande:

  1. C'è uno strumento semplice per ottenere lo stesso risultato? Ho bisogno che funzioni attraverso un proxy che limiti i nomi degli host, ecco perché uso la pagina degli strumenti di rete.
  2. Come posso renderlo una funzione del nome host? qualcosa come ottenere IP (hostname)

# 3 è una domanda molto diversa dalle altre due e, così com'è attualmente, estremamente ampia. Dubito che si possa anche rispondere in modo positivo come è scritto ora.
a CVn

Hai ragione, grazie. L'ho modificato.
Esteban Crespi

Risposte:


5

Prova qualcosa del genere

export IP=`( dig ${HOSTNAME} A +short | tail -n1; \
             dig ${HOSTNAME} AAAA +short | tail -n1 ) \
           | head -n1`

Questo ti darà:

  • Per un host con almeno un indirizzo IPv4, (uno dei) l'indirizzo IPv4
  • Per un host senza indirizzi IPv4 ma con almeno un indirizzo IPv6, (uno dei) l'indirizzo IPv6
  • Per un host senza indirizzo (IPv4 o IPv6) nel DNS, o se c'è un errore del resolver, un valore vuoto

Se non hai bisogno di funzionalità IPv4 o IPv6 (la tua domanda sembra indicare che sei maggiormente interessato all'indirizzo IPv4), rimuovi semplicemente quello dig comando ( A è IPv4, AAAA è IPv6). Quindi, se sei interessato solo agli indirizzi IPv4:

export IP=`dig ${HOSTNAME} A +short | tail -n1`

Il tail -n1 garantisce di ottenere un indirizzo IP (nel caso di CNAMEe possibilmente altri tipi di record, dig mostra il nome canonico di riferimento sulla prima riga). Il head -n1 garantisce di ottenere un solo indirizzo restituendo solo la prima riga dell'output rimanente (non necessario nel caso di una sola famiglia di indirizzi, poiché tail restituirà solo un indirizzo). Poiché i record DNS vengono normalmente pubblicati in modalità round robin, non è garantito quale indirizzo esatto verrà restituito per host con più indirizzi.

Non ho molta familiarità con la scrittura di funzioni di bash, ma dovrebbe essere relativamente facile trasformarlo in una funzione.


La maggior parte degli stack preferisce IPv6, se disponibile; di conseguenza, probabilmente lo vorrai tail -n 1 anche al livello più alto, se si desidera rispecchiare l'ordine di risoluzione dell'host. Inoltre, anche questo approccio non rispetta il NIS, o /etc/hosts, o nsswitch.confeppure lo uso regolarmente su macchine dove resolveip -s non è necessariamente disponibile, quindi forse sono un po 'troppo pedante. ;)
BMDan

@BMDan Lo snippet nella domanda non supporta nemmeno IPv6, che è (probabilmente, sono passati circa due anni) perché sono andato con questo particolare ordinamento.
a CVn

Non sono sicuro di capire il tuo significato. Lo snippet che hai fornito richiede esplicitamente sia A che AAAA, quindi è compatibile con IPv6. Sono d'accordo in quanto la tua affermazione che condividi funzionalità con l'originale, ma penso che l'obiettivo è quello di Migliorare su cosa c'era nella questione, non solo per pappaggere le sue mancanze.
BMDan

2

Prova quanto segue:

  • host www.example.com
  • nslookup www.example.com
  • dig www.example.com

A seconda di quante informazioni aggiuntive desideri, scegli il candidato appropriato.


Grazie per la tua risposta, ho provato tutti e tre ma non sembrano funzionare (nel mio contesto). Per esempio host restituisce il messaggio host www.example.com not found: 3(NXDOMAIN). Ho anche creato il file etc / resolv.conf entrambi con l'ip del server dns ottenuto con il comando ipconfig /all e con l'IP di dns pubblico di googles 8.8.8.8 senza successo. Temo che il problema derivi da una sorta di limitazione posta dalla sicurezza della mia rete.
Esteban Crespi

Sembra un problema con la risoluzione DNS sulla tua macchina. Il dig comando può tornare utile qui, consentendo di specificare il server dei nomi da utilizzare, ad es. dig @ns.example.com www.example.com userebbe ns.example.com come server dei nomi (qui puoi anche specificare un IP). nslookup permette anche questo (si prega di verificare con man nslookup per dettagli). host sarebbe stato particolarmente piacevole per te dato che restituisce solo l'IP (senza ulteriori informazioni da filtrare), ma richiede la risoluzione DNS per lavorare direttamente sull'host.
Izzy
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.