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.

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    

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.


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


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

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

Tidak Ada Permintaan DNS


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.