【发布时间】:2015-04-26 04:16:14
【问题描述】:
我正在 Kali Linux 上做一个项目,我在其中运行工具 Ettercap,它列出了网络上的 IP 地址并将它们保存到 .txt。然后我需要在另一个工具nmap上使用这些IP,所以我想编写一个可以将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;
}
结果输出只是一堆随机数。有任何想法吗?我使用 Kali 重要吗?我的 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 地址:”,并尽可能将其作为列表输出。
【问题讨论】:
-
您不检查来自
fscanf()的返回值,因此您不知道它是否认为它能够从输入中读取整数。您永远不会知道逗号是否匹配,这可能无关紧要。您的错误消息应该打印在标准错误 (stderr) 上,而不是标准输出上。您的错误退出可能应该是1或EXIT_FAILURE而不是0,这表明成功。您使用 Kali Linux 的事实几乎可以肯定是完全无关紧要的。你的代码完全是标准的 C,除了你应该有一个明确的返回类型:int main()。 -
对于@JonathanLeffler 的评论,我唯一可以补充的是,对于一些不存在的表示 IP 地址的格式说明符(和类型),您似乎对
%d(和int)感到困惑,并且您可能应该使用%s(对应于char的数组,而不是指向int的指针)将此输入作为字符串处理,而不是...char ip_addr[256]; while (fscanf(ipList, "%255s", ip_addr) == 1) { printf("nmap -A -T4 -F %s\n", ip_addr); } -
@undefinedbehaviour:好点。但是,如果 IP 地址以逗号分隔,则可能需要为
"%255[^,],"。 -
感谢大家的帮助。实际上,在生成 IP 列表时,它是以列表的形式而不是并排或逗号分隔的形式。
-
@JonathanLeffler 沿着这条切线提出一个很好的观点是,
"%255[^,],"在故障模式方面引入了不同的挑战。