P.S. Как правило лучше заворачивать слои по возрастанию (С в Bash а не наоборот).
C Код формирует IP интерфейсов на выходе.
root@hamanager bash_c # cat test5.c
#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
int main (int argc, const char * argv[]) {
struct ifaddrs * ifAddrStruct=NULL;
struct ifaddrs * ifa=NULL;
void * tmpAddrPtr=NULL;
getifaddrs(&ifAddrStruct);
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4
// is a valid IP4 Address
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
printf("%s_IPv4 %s\n", ifa->ifa_name, addressBuffer);
} else if (ifa->ifa_addr->sa_family==AF_INET6) { // check it is IP6
// is a valid IP6 Address
tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("%s_IPv6 %s\n", ifa->ifa_name, addressBuffer);
}
}
if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
return 0;
}
Компилим:
root@hamanager bash_c # gcc -o ztest1 test5.c
Тестим:
root@hamanager bash_c # ./ztest1
lo_IPv4 127.0.0.1
eth0_IPv4 10.10.8.60
eth1_IPv4 10.10.4.60
lo_IPv6 ::1
eth0_IPv6 fe80::20c:29ff:feb2:da9
Заворачиваем С бинарь в баш с указанием нужного интерфейса:
root@hamanager bash_c # cat zbash.sh
#!/bin/bash
nmap -sP `./ztest1|grep eth0_IPv4|awk {'print $2'}`/24
Получаем конечный результат идентичный ответу выше:
root@hamanager bash_c # ./zbash.sh
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2014-03-08 03:06 MSK
Host 10.10.8.1 appears to be up.
MAC Address: 00:1B:21:17:0F:41 (Unknown)
Host 10.10.8.2 appears to be up.
MAC Address: 00:1B:21:17:0F:DE (Unknown)
..............................................