2015-04-26 69 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… 
}