2015-04-26 47 views
2

我在Kali Linux上做了一个项目,在那里我运行Ettercap工具,它列出了网络上的IP地址并将它们保存到一个.txt文件中。然后我需要在另一个工具nmap上使用这些IP,所以我想编写一个C代码,可以将IP.txt中的IP保存到一个数组中。到目前为止,这是最接近的工作代码:从文件读取数据到数组 - C

#include <stdio.h> 
#include <stdlib.h> 

main(){ 

    FILE *ipList; 
    ipList = fopen("IP.txt", "r"); 

    int ipArray[10]; 
    int i; 

    if (ipList == NULL) 
    { 
     printf("Error\n"); 
     exit (0); 
    } 
    for (i = 0; i < 10; i++) 
    { 
     fscanf(ipList, "%d,", &ipArray[i]); 

    } 

    for (i = 0; i < 10; i++) 
    { 
      printf("nmap -A -T4 -F %d\n\n", ipArray[i]); 
     } 

    fclose(ipList); 

    return 0; 
} 

结果输出只是一堆随机数。有任何想法吗?我使用卡莉有什么关系吗?我的ipArray设置为10;如果我没有10个IP地址,会不会成为问题?


的IP地址存储这样的:

IP地址:10.0.0.1

IP地址:10.0.0.2

IP地址:10.0.0.3

IP地址:10.0.0.4


我已经取得了进展。这是我目前的输出:

nmap -A -T4 -F IP | nnmap -A -T4 -F地址| nnmap -A -T4 -F:| nnmap -A -T4 -F 10.0.2.2 | nnmap -A -T4 -F IP | nnmap -A -T4 -F地址| nnmap -A -T4 -F:| nnmap -A -T4 -F 10.0.2.3 | nnmap -A -T4 -F IP | nnmap -A - T4 -F地址| NNMAP -A -T4 -F:| NNMAP -A -T4 -F 10.0.2.4

这里是我当前的代码:

#include <stdio.h> 

#include <stdlib.h> 



main() { 



FILE *ipList; 
ipList = fopen("IP.txt","r"); 



char ip_addr[256]; 



while (fscanf(ipList, "%255s", ip_addr) == 1){ 

printf("nmap -A -T4 -F %s|n", ip_addr); 

} 



if (ipList == NULL){ 

printf("error\n"); 

exit (1); 

} 



fclose(ipList); 

return 0; 

} 

所以,现在我的目标是让代码忽略“IP地址:”,如果可能,将其输出为列表。

+2

你不从'的fscanf检查返回值()'所以,你不知道它是否认为它能够从输入读取一个整数。你永远不会知道这个逗号是否匹配,这可能没有关系。您的错误信息应打印在标准错误('stderr')上,而不是标准输出中。你的错误出口可能应该是'1'或'EXIT_FAILURE'而不是'0',表示成功。您使用Kali Linux的事实几乎肯定是完全无关紧要的。你的代码完全是标准的C,除了你应该有一个明确的返回类型:'int main()'。 –

+1

我可以添加到@ JonathanLeffler的评论的唯一的事情是,你似乎混淆了'%d'(和'int')代表IP地址的一些不存在的格式说明符(和类型),你应该使用'%s'(对应一个'char'数组,而不是一个指向'int'的指针)来处理这个输入作为字符串, while(fscanf(ipList,“%255s”,ip_addr)== 1){printf(“nmap -A -T4 -F%s \ n”,ip_addr); }' – Sebivor

+0

@undefinedbehaviour:好点。但是,如果IP地址用逗号分隔,那么可能需要“%255 [^,],”。 –

回答

1

鉴于输入格式为线,如:

IP address : 10.0.0.1 

,那么你需要阅读该地址是一个字符串,或4个独立的小整数。

char *ip_address[16]; 

for (i = 0; i < 10; i++) 
{ 
    if (fscanf(fp, "IP address : %15s", ip_address) != 1) 
     …report format error… 
    …code to convert dotted-decimal to IPv4 address… 
} 

或:

int ip[4]; 

for (i = 0; i < 10; i++) 
{ 
    if (fscanf(fp, "IP address : %d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]) != 4) 
     …report format error… 
    for (j = 0; j < 4; j++) 
    { 
     if (ip[j] < 0 || ip[j] > 255) 
      …report bogus value… 
    } 
    …convert dotted-decimal values into IPv4 address… 
}