Ubuntu 10.10以上
在我的脚本中,我需要查找给定主机名的IP。
如果该名称在中列出/etc/hosts
,则命令应该从而/etc/hosts
不是从DNS服务器打印IP 。
什么命令我试过(nslookup
,dig
,host
),完全无视/etc/hosts
-至少对于那些不知道的DNS服务器名称。
注意:我更喜欢不需要我/etc/hosts
手工grep 的解决方案。
Ubuntu 10.10以上
在我的脚本中,我需要查找给定主机名的IP。
如果该名称在中列出/etc/hosts
,则命令应该从而/etc/hosts
不是从DNS服务器打印IP 。
什么命令我试过(nslookup
,dig
,host
),完全无视/etc/hosts
-至少对于那些不知道的DNS服务器名称。
注意:我更喜欢不需要我/etc/hosts
手工grep 的解决方案。
Answers:
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
这是超级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
我只是使用以下内容代替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);
}
}
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'
没有DNS查询
getent hosts amd.com
可能会更简单