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.

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    

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.


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


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);
    }
}

0
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

Aucune requête DNS


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
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.