18

Ubuntu 10.10+

In my script I need to lookup an IP for a given host name.

If that name is listed in /etc/hosts, then command should print IP from /etc/hosts, not from DNS server.

What commands I tried (nslookup, dig, host), completely ignore /etc/hosts — at least for names that are not known to the DNS server.

Note: I would prefer solution that would not require me to grep /etc/hosts by hand.

24

getent uses the low-level glibc information functions to query all configured sources.

$ 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    
1
  • 4
    getent hosts amd.com is probably a little simpler – higuita Oct 22 '15 at 13:35
6
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10

From the syslinux package, at least in Ubuntu 12.04.

3

This is super-hacky, but I've been using it for ages, and it works (for 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}';
}

Use like: ipfor google.com

1
  • Hacky but portable. Me like. – luis.espinal Jul 22 '14 at 14:11
0

I simply use the following as replacement for inapt 'host' cmd. This automatically will do the right thing with some restrictions (IPv4 only).

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'

No DNS Query

1
  • While this may indeed answer the question it would be good to explain how and why it does so. A command line with little or no explanation as to what it is doing may not help future visitors who might need to solve a similar problem. – Mokubai Aug 15 '15 at 7:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.