우분투 10.10+
내 스크립트에서 주어진 호스트 이름에 대한 IP를 찾아야합니다.
해당 이름이에 나열된 경우 /etc/hosts
명령은 /etc/hosts
DNS 서버가 아니라에서 IP를 인쇄해야 합니다.
내가 뭘하려 명령 ( nslookup
, dig
, host
), 완전히 무시 /etc/hosts
- 적어도 DNS 서버에 알려지지 않은 이름을.
참고 : /etc/hosts
손으로 잡을 필요가없는 솔루션을 선호합니다 .
우분투 10.10+
내 스크립트에서 주어진 호스트 이름에 대한 IP를 찾아야합니다.
해당 이름이에 나열된 경우 /etc/hosts
명령은 /etc/hosts
DNS 서버가 아니라에서 IP를 인쇄해야 합니다.
내가 뭘하려 명령 ( nslookup
, dig
, host
), 완전히 무시 /etc/hosts
- 적어도 DNS 서버에 알려지지 않은 이름을.
참고 : /etc/hosts
손으로 잡을 필요가없는 솔루션을 선호합니다 .
답변:
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
이것은 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);
}
}
getent hosts amd.com
아마 조금 더 간단합니다