linux - tengo - Encontrar una dirección IP desde un nombre de interfaz
ifconfig (2)
En una caja Linux, los nombres comunes de la interfaz se ven como eth0, eth1, etc. Sé cómo encontrar al menos una dirección IP usando gethostbyname
o funciones similares, pero no conozco ninguna forma de especificar qué interfaz con nombre quiero la IP Dirección de. Podría usar ifconfig y analizar el resultado, pero desear esta información parece ... poco elegante.
¿Hay alguna forma de, por ejemplo, enumerar todas las interfaces y sus direcciones IP (y quizás las direcciones MAC) en una colección? ¿O al menos algo parecido a gethostbyinterface("eth0")
?
De 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 <[email protected]>
*/
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;
}
editar: Vi que no te gusta el bombardeo. Luego puede ver cómo ifconfig hace su trabajo (extrae al menos cierta información de / proc).
Cuando tienes el nombre de la interfaz, puedes hacer esto (en tu caparazón):
ifconfig eth0 | grep ''inet addr'' | sed -e ''s/:/ /'' | awk ''{print $3}''
Para enumerar las interfaces, puede usar esto:
ifconfig | egrep ''^[^ ]'' | awk ''{print $1}''
Conjunto:
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