从接口名称查找IP地址

在Linux上,常见的接口名称看起来像eth0,eth1等。我知道如何使用gethostbyname或类似的函数来查找至less一个IP地址,但是我不知道用什么方法来指定我想要的IP地址。 我可以使用ifconfig和parsing输出,但为这个信息炮轰出现…不雅观。

有没有办法,例如枚举所有的接口及其IP地址(也可能是MAC地址)到一个集合? 或者至less有一些沿着gethostbyinterface("eth0")

Solutions Collecting From Web of "从接口名称查找IP地址"

从TLUG :

 #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <unistd.h> /** * getIPv4() * * This function takes a network identifier such as "eth0" or "eth0:0" and * a pointer to a buffer of at least 16 bytes and then stores the IP of that * device gets stored in that buffer. * * it return 0 on success or -1 on failure. * * Author: Jaco Kroon <jaco@kroon.co.za> */ int getIPv4(const char * dev, char * ipv4) { struct ifreq ifc; int res; int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) return -1; strcpy(ifc.ifr_name, dev); res = ioctl(sockfd, SIOCGIFADDR, &ifc); close(sockfd); if(res < 0) return -1; strcpy(ipv4, inet_ntoa(((struct sockaddr_in*)&ifc.ifr_addr)->sin_addr)); return 0; } int main() { char ip[16]; if(getIPv4("eth0", ip) == 0) printf("IPv4: %s\n", ip); else printf("No IP\n"); return 0; } 

编辑:我看到你不喜欢炮击。 然后你可以看看ifconfig如何完成它的工作(至少从/ proc中提取一些信息)。

当你有接口名称时,你可以这样做(在你的shell中):

 ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}' 

枚举接口你可以使用这个:

 ifconfig | egrep '^[^ ]' | awk '{print $1}' 

联合:

 for x in `ifconfig | egrep '^[^ ]' | awk '{print $1}'`; do echo -n "${x}" echo -n " " ifconfig "${x}" | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}' done