Bash: wyszukaj adres IP nazwy hosta, w tym / etc / hosts podczas wyszukiwania

17

Ubuntu 10.10+

W moim skrypcie muszę wyszukać adres IP dla danej nazwy hosta.

Jeśli ta nazwa znajduje się na liście /etc/hosts, polecenie powinno wypisać adres IP /etc/hosts, a nie z serwera DNS.

Co nakazuje próbowałem ( nslookup, dig, host), całkowicie ignorować /etc/hosts- przynajmniej dla nazw, które nie są znane do serwera DNS.

Uwaga: wolałbym rozwiązanie, które nie wymagałoby ode mnie /etc/hostsręcznego grepowania .

Alexander Gladysh
źródło

Odpowiedzi:

23

getent używa niskopoziomowych funkcji informacyjnych glibc do przeszukiwania wszystkich skonfigurowanych źródeł.

$ 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
źródło
3
getent hosts amd.comjest prawdopodobnie trochę prostsze
higuita
6
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10

Z syslinuxpakietu, przynajmniej w Ubuntu 12.04.

l0b0
źródło
3

To jest super-hacky , ale używam go od wieków i działa (dla 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}';
}

Użyj jak: ipfor google.com

Mark Jaquith
źródło
Zuchwały, ale przenośny. Ja lubię
luis.espinal
0

Po prostu używam poniższego jako zamiennika dla cmd nieprzystosowanego „hosta”. To automatycznie zrobi właściwą rzecz z pewnymi ograniczeniami (tylko IPv4).

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
źródło
0
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

Brak zapytania DNS

Philippe Gachoud
źródło
Chociaż może to rzeczywiście odpowiedzieć na pytanie, dobrze byłoby wyjaśnić, w jaki sposób i dlaczego to robi. Wiersz poleceń z niewielkim lub żadnym wyjaśnieniem tego, co robi, może nie pomóc przyszłym użytkownikom, którzy mogą potrzebować rozwiązać podobny problem.
Mokubai