Un moyen facile d'obtenir l'adresse IP du nom d'hôte à l'aide d'un shell Unix


12

Quelle est la manière la plus simple d'obtenir l'adresse IP d'un nom d'hôte?

Je pensais à essayer un pinget à l'analyser à partir de la sortie. Cependant, cela ne semble pas très agréable et ne fonctionnera probablement pas de la même manière sur tous les systèmes.

J'ai cherché un peu et trouvé des solutions avec nslookup, mais cela ne fonctionne pas pour les noms d'hôtes dans /etc/hosts.


Je me demande encore un peu pourquoi les shells Unix ne sont pas considérés comme des langages de programmation ...
Albert

Parce que le shell est traditionnellement considéré comme du script, pas de la programmation;)
Tino

Réponses:


5

Vous pouvez le faire avec des appels système standard. Voici un exemple en 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);

produit la sortie:

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

(Sur la ligne de commande, le même script peut être écrit comme suit perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)':)

Vous pouvez le faire de manière similaire dans d'autres langues - voir la page de manuel pour les appels système sur man -s3 gethostbynameetc.


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

Très étrange que cette réponse soit un code de programme ... :) Ressemble presque à une réponse Stackoverflow. N'appartient pas vraiment à Serverfault. Mais j'accepterai quand même la réponse.
Albert

@Albert: pour être honnête: 1. la question a été publiée sur SO à l'origine et migrée vers SF, et 2. le type de données que vous recherchez doit être analysé avec quelque chose ; certaines personnes considèrent Perl comme une meilleure forme de script shell: D
Ether

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

Éditer

Sous Linux, (et certaines variantes d'OS X, au moins), vous pourriez être en mesure d'utiliser resolveip, qui fait partie du package serveur MySQL:

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

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1

Ne fonctionne pas non plus. (Pour les hôtes /etc/hosts.) Essayez host localhost.
Albert

serv ~ $ host localhost \n localhost has address 127.0.0.1

Hm, eh bien, pas ici. Je suis curieux de savoir pourquoi cela fonctionne pour vous. Ou pourquoi ça ne me convient pas.
Albert

2
Voir mon montage - vous pourriez essayer resolveip.

Hm, resolveipn'est pas installé par défaut sur ma Debian.
Albert

9

Ce poste ancien semble avoir de nombreuses solutions créatives.

Si je dois m'assurer que l' /etc/hostsaccès est également disponible , j'ai tendance à utiliser

getent hosts somehost.com

Cela fonctionne, au moins si `/etc/nsswitch.conf 'a été configuré pour utiliser des fichiers (comme c'est généralement le cas).


Nice, et fonctionne également pour IPv6.
Tino

Et n'a pas besoin d'installer syslinux!
Claudiu

Il est intéressant de noter que pour certaines adresses IP, il ne renvoie rien tandis ahostsqu'il renvoie des informations sur plusieurs lignes.
akostadinov

7

Pour IPv4, il existe un programme standard qui fonctionne immédiatement avec le résolveur, y compris / etc / hosts:

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

Il fait partie de Debian, installez-le avec:

apt-get install syslinux

Pour d'autres protocoles que IPv4 (comme IPv6), je ne connais actuellement pas d'outil similaire. Mise à jour: Pour cette raison, je viens d'écrire un petit outil qui est également capable de résoudre IPv6:

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

Il est conçu pour une utilisation rapide et sale du shell, gethostipmais permet également IPv6:

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

Il peut également être utilisé de manière interactive, par exemple:

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

HTH


Je suis venu ici pour donner cette réponse, vous avez voté à la place.
Pas maintenant

4

Pourquoi pas dig +short hostname?

(requête DNS)


Il n'en tient pas /etc/hostscompte.
Janne Pikkarainen

DNS est censé être une source définitive pour la résolution de noms, et si vous utilisez le fichier hôte pour remplacer, c'est très bien. Mais c'est une dérogation, pas définitive ...
gWaldo

Je sais, mais la question d'origine voulait / etc / hosts :)
Janne Pikkarainen

assez sur; ma compréhension de la lecture échoue ...
gWaldo

3

Eh bien, ma solution actuelle:

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

cela ne donne pas seulement l'IP: PING www.l.google.com (72.14.234.104): 56 octets de données
Federico klez Culloca

Oui, il semble que le sedcomportement soit légèrement différent sur chaque système. :) Comme c'est ennuyeux. Je l'ai un peu changé, je pense que ça devrait marcher partout maintenant.
Albert

0

Sur certains Unices, les éléments suivants fonctionneront:

arp <hostname>

Par exemple sur Mac OS X, j'obtiens ceci:

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

Eh bien, il trouve l'entrée, mais il répertorie uniquement son MAC, pas son IP. :)
Albert

Ah, arp -n hostnamemontre l'IP.
Albert

Seulement, cette méthode ne fonctionne pas pour les serveurs en dehors du réseau. : P
Albert

0

L'utilisation pingn'est pas si mauvaise que cela, car vous n'avez généralement pas de fortes dépendances.

Voici la fonction que j'ai utilisée sur les systèmes 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 obtient de votre sous-réseau (192.168.1.0 ou autre) les adresses
  • avec grep, obtenez uniquement la ligne du nom d'hôte que vous recherchez
  • Avec sed, obtenez uniquement l'adresse IP entre parenthèses

2
Un peu plus d'informations sur les différents commutateurs et pourquoi utilisés ajouteraient à votre réponse
Dave M

Il y a au moins quatre raisons différentes pour lesquelles cette réponse ne fonctionnera pas. Vous faites des hypothèses sur la plage d'adresses IP dans laquelle la réponse sera trouvée. Il est inefficace car il génère beaucoup plus de trafic réseau que nécessaire. Cela ne fonctionne que pour les adresses IP qui répondent aux sondes. Il suppose que le DNS inversé contient exactement les mêmes mappages que le DNS direct.
kasperd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.