Bash:在主机名中查找IP,包括/ etc / hosts


17

Ubuntu 10.10以上

在我的脚本中,我需要查找给定主机名的IP。

如果该名称在中列出/etc/hosts,则命令应该从而/etc/hosts不是从DNS服务器打印IP 。

什么命令我试过(nslookupdighost),完全无视/etc/hosts-至少对于那些不知道的DNS服务器名称。

注意:我更喜欢不需要我/etc/hosts手工grep 的解决方案。

Answers:


23

getent 使用低级glibc信息功能查询所有已配置的源。

$ 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.com可能会更简单
higuita

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

syslinux软件包中,至少在Ubuntu 12.04中。


3

这是超级hacky,但是我已经使用了很长时间了,并且它可以工作(适用于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}';
}

使用方式如下: ipfor google.com


轻巧但便携。我喜欢
luis.espinal 2014年

0

我只是使用以下内容代替inapt'host'cmd。这会自动执行某些限制的正确操作(仅限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'

没有DNS查询


尽管这确实可以回答这个问题,但最好解释它如何以及为什么这样做。命令行对其执行的操作几乎没有或没有任何解释,可能不会帮助可能需要解决类似问题的将来的访问者。
Mokubai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.