Bash: tra cứu IP cho tên máy chủ, bao gồm / etc / hosts trong tìm kiếm


17

Ubuntu 10.10+

Trong kịch bản của tôi, tôi cần tra cứu một IP cho một tên máy chủ nhất định.

Nếu tên đó được liệt kê trong /etc/hosts, thì lệnh nên in IP từ /etc/hosts, không phải từ máy chủ DNS.

Có gì lệnh tôi đã cố gắng ( nslookup, dig, host), hoàn toàn bỏ qua /etc/hosts- ít nhất là cho những tên không biết đến các máy chủ DNS.

Lưu ý: Tôi muốn giải pháp không yêu cầu tôi phải grep /etc/hostsbằng tay.

Câu trả lời:


23

getent sử dụng các hàm thông tin glibc cấp thấp để truy vấn tất cả các nguồn được định cấu hình.

$ 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.comcó lẽ đơn giản hơn một chút
higuita

6
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10

Từ syslinuxgói, ít nhất là trong Ubuntu 12.04.


3

Đây là siêu hacky , nhưng tôi đã sử dụng nó từ lâu và nó hoạt động (đối với 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}';
}

Sử dụng như: ipfor google.com


Hacky nhưng di động. Tôi thích.
luis.espinal

0

Tôi chỉ đơn giản là sử dụng như sau để thay thế cho cmd 'host' inapt. Điều này tự động sẽ làm điều đúng với một số hạn chế (chỉ 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'

Không có truy vấn DNS


Trong khi điều này thực sự có thể trả lời câu hỏi, nó sẽ tốt để giải thích làm thế nào và tại sao nó làm như vậy. Một dòng lệnh với rất ít hoặc không có lời giải thích nào về những gì nó đang làm có thể không giúp những khách truy cập trong tương lai có thể cần giải quyết vấn đề tương tự.
Mokubai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.