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.

Albert
la source
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.

Éther
la source
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
ambre
la source
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).

Janne Pikkarainen
la source
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

Tino
la source
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)

gWaldo
la source
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"
Albert
la source
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
ennuikiller
la source
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 '()' ; }
Bruno BEAUFILS
la source
-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
Philippe Gachoud
la source
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