Die Suche nach einer IP-Adresse aus einem Schnittstellennamen
-
06-07-2019 - |
Frage
Auf einer Linux-Box, die gemeinsamen Schnittstellennamen aussehen wie eth0, eth1, usw. Ich weiß, wie mindestens eine IP-Adresse mit gethostbyname
oder ähnlichen Funktionen zu finden, aber ich kenne keine Art und Weise, welche Schnittstelle mich angeben, benannt will die IP-Adresse. Ich kann ifconfig verwenden und die Ausgabe analysieren, aber für diese Informationen Beschuss aus scheint ... unelegant.
Gibt es eine Möglichkeit, um, sagen wir, aufzuzählen, alle Schnittstellen und deren IP-Adressen (und vielleicht auch MAC-Adressen) in einer Sammlung? Oder zumindest etwas entlang der Linien von gethostbyinterface("eth0")
?
Lösung
// Originally from http://www.tlug.org.za/wiki/index.php/Obtaining_your_own_IP_address
#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;
}
Aktualisieren :. Verschoben Tote Link auf einen Kommentar (für die Nachwelt) (Dank @obayhan) und fügte hinzu: Syntax-Hervorhebung
Andere Tipps
Bearbeiten Ich habe Sie nicht mögen Beschuss. Dann können Sie sehen, wie ifconfig macht seinen Job (extrahiert sie zumindest einige Informationen aus / proc).
Wenn Sie Schnittstelle Namen haben, können Sie dies tun (in der Shell):
ifconfig eth0 | grep 'inet addr' | sed -e 's/:/ /' | awk '{print $3}'
Um Schnittstellen aufzählen können Sie verwenden:
ifconfig | egrep '^[^ ]' | awk '{print $1}'
In Kombination:
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