buntu 10.10 +
私のスクリプトでは、特定のホスト名のIPを検索する必要があります。
その名前が/etc/hosts
にリストされている場合、コマンドはDNSサーバーからではなく/etc/hosts
からIPを印刷する必要があります。
私が試したコマンド(nslookup
、Dig
、Host
)は、/etc/hosts
を完全に無視します—少なくともDNSサーバーに認識されていない名前については。
注:私は手動で/etc/hosts
をgrepする必要がないソリューションを好みます。
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
$ gethostip localhost
localhost 127.0.0.1 7F000001
$ gethostip -d example.org
192.0.43.10
少なくともUbuntu 12.04では、syslinux
パッケージから。
これはsuper-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クエリなし