buntu 10.10 +
Dans mon script, j'ai besoin de consulter une adresse IP pour un nom d'hôte donné.
Si ce nom est répertorié dans /etc/hosts
, alors la commande doit imprimer IP de /etc/hosts
, pas du serveur DNS.
Quelles commandes j'ai essayé (nslookup
, Dig
, Host
), ignore complètement /etc/hosts
- au moins pour des noms qui ne sont pas connus avec le serveur DNS.
Remarque: je préférerais la solution qui ne vous obligerait pas à grep /etc/hosts
par la main.
getent
utilise les fonctions d'information GLIBC de bas niveau pour interroger toutes les sources configurées.
$ 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
J'utilise simplement ce qui suit comme remplacement de la cmd 'hôte' Inapt. Cela fera automatiquement la bonne chose avec certaines restrictions (IPv4 uniquement).
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'
Aucune requête DNS