Bash: Suchen Sie eine IP nach einem Hostnamen, einschließlich / etc / hosts bei der Suche

17

Ubuntu 10.10+

In meinem Skript muss ich eine IP für einen bestimmten Hostnamen suchen.

Wenn dieser Name in aufgeführt ist /etc/hosts, sollte der Befehl die IP- /etc/hostsAdresse nicht vom DNS-Server drucken .

Welche Befehle habe ich versucht ( nslookup, dig, host), völlig ignorieren /etc/hosts- zumindest für die Namen , die auf dem DNS - Server nicht bekannt sind.

Hinweis: Ich würde eine Lösung vorziehen, bei der ich nicht /etc/hostsvon Hand greifen müsste .

Alexander Gladysh
quelle

Antworten:

23

getent Verwendet die einfachen Glibc-Informationsfunktionen, um alle konfigurierten Quellen abzufragen.

$ 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
quelle
3
getent hosts amd.comist wahrscheinlich ein wenig einfacher
higuita
6
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10

Aus dem syslinuxPaket zumindest in Ubuntu 12.04.

l0b0
quelle
3

Das ist supergeil , aber ich benutze es seit Ewigkeiten und es funktioniert (für 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}';
}

Verwenden Sie wie: ipfor google.com

Mark Jaquith
quelle
Hacky aber tragbar. Ich mag.
Luis.espinal
0

Ich benutze einfach folgendes als Ersatz für inapt 'host' cmd. Mit einigen Einschränkungen wird dies automatisch das Richtige tun (nur 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
quelle
0
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

Keine DNS-Abfrage

Philippe Gachoud
quelle
Während dies in der Tat die Frage beantworten kann, wäre es gut zu erklären, wie und warum dies geschieht. Eine Befehlszeile mit wenigen oder keinen Erklärungen zu ihrer Funktionsweise kann zukünftigen Besuchern, die möglicherweise ein ähnliches Problem lösen müssen, möglicherweise nicht helfen.
Mokubai