Bash: cari IP untuk nama host, termasuk / etc / hosts dalam pencarian

17

Ubuntu 10.10+

Dalam skrip saya, saya perlu mencari IP untuk nama host yang diberikan.

Jika nama itu terdaftar /etc/hosts, maka perintah harus mencetak IP dari /etc/hosts, bukan dari server DNS.

Apa perintah saya mencoba ( nslookup, dig, host), benar-benar mengabaikan /etc/hosts- setidaknya untuk nama-nama yang tidak dikenal ke server DNS.

Catatan: Saya lebih suka solusi yang tidak mengharuskan saya untuk mengambil /etc/hostsdengan tangan.

Alexander Gladysh
sumber

Jawaban:

23

getent menggunakan fungsi informasi glibc tingkat rendah untuk menanyakan semua sumber yang dikonfigurasi.

$ 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
sumber
3
getent hosts amd.commungkin sedikit lebih sederhana
higuita
6
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10

Dari syslinuxpaket, setidaknya di Ubuntu 12.04.

l0b0
sumber
3

Ini super-hacky , tapi saya sudah menggunakannya sejak lama, dan itu berfungsi (untuk 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}';
}

Gunakan seperti: ipfor google.com

Mark Jaquith
sumber
Hacky tapi portable. Aku suka.
luis.espinal
0

Saya hanya menggunakan yang berikut ini sebagai pengganti untuk 'host' cmd inapt. Ini secara otomatis akan melakukan hal yang benar dengan beberapa batasan (hanya 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
sumber
0
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'

Tidak Ada Permintaan DNS

Philippe Gachoud
sumber
Meskipun ini memang dapat menjawab pertanyaan, akan lebih baik untuk menjelaskan bagaimana dan mengapa itu terjadi. Baris perintah dengan sedikit atau tanpa penjelasan tentang apa yang dilakukannya mungkin tidak membantu pengunjung masa depan yang mungkin perlu menyelesaikan masalah yang sama.
Mokubai