Bash: recherche une adresse IP pour un nom d'hôte, y compris / etc / hosts dans la recherche

17

Ubuntu 10.10+

Dans mon script, je dois rechercher une IP pour un nom d'hôte donné.

Si ce nom est répertorié dans /etc/hosts, la commande doit imprimer l'IP à partir /etc/hostsdu serveur DNS et non à partir de celui-ci.

Qu'est - ce que j'ai essayé les commandes ( nslookup, dig, host), ignorer complètement /etc/hosts- au moins pour les noms qui ne sont pas connus du serveur DNS.

Remarque: je préférerais une solution qui ne nécessiterait pas que je grep /etc/hostsà la main.

Alexander Gladysh
la source

Réponses:

23

getent utilise les fonctions d'information de bas niveau de la glibc pour interroger toutes les sources configurées.

$ getent ahosts amd.com
163.181.249.32  STREAM amd.com
163.181.249.32  DGRAM  
163.181.249.32  RAW    
$ getent ahosts ipv6.google.com
2001:4860:b009::69 STREAM ipv6.l.google.com
2001:4860:b009::69 DGRAM  
2001:4860:b009::69 RAW    
Ignacio Vazquez-Abrams
la source
3
getent hosts amd.comest probablement un peu plus simple
higuita
6
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10

À partir du syslinuxpackage, au moins dans Ubuntu 12.04.

l0b0
la source
3

C'est super-hacky , mais je l'utilise depuis des lustres, et ça marche (pour ipv4):

function ipfor() {
  ping -c 1 $1 | grep -Eo -m 1 '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}';
}

Utilisez comme: ipfor google.com

Mark Jaquith
la source
Hacky mais portable. Moi comme.
luis.espinal
0

J'utilise simplement ce qui suit en remplacement de la cmd inapt 'host'. Cela fera automatiquement la bonne chose avec certaines restrictions (IPv4 uniquement).

myhost.c:

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>

#define TOIN(a) ((struct sockaddr_in *)&(a))

main(argc, argv)
    char **argv;
{
    int err;
    struct sockaddr sa;
    char hbuf[NI_MAXHOST];

    if (argc <= 1) {
        printf("more args\n");
        exit(-1);
    }
    TOIN(sa)->sin_family = AF_INET;
    if (inet_pton(AF_INET, *(argv + 1), &TOIN(sa)->sin_addr) != 1) {
        printf("can't inet_pton: %s\n", errno ? strerror(errno) : "format err");
        exit(-1);
    }
    if (err = getnameinfo(&sa, sizeof(struct sockaddr_in), hbuf, sizeof hbuf, 0, 0, NI_NAMEREQD)) {
//        printf("%s\n", gai_strerror(err));
        printf("Host %s not found: 3(NXDOMAIN)\n", *(argv + 1));
        exit(-1);
    } else {
        printf("%s\n", hbuf);
        exit(0);
    }
}
sparkie
la source
0
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

Aucune requête DNS

Philippe Gachoud
la source
Bien que cela puisse effectivement répondre à la question, il serait bon d'expliquer comment et pourquoi il le fait. Une ligne de commande avec peu ou pas d'explications sur ce qu'elle fait peut ne pas aider les futurs visiteurs qui pourraient avoir besoin de résoudre un problème similaire.
Mokubai