基于Georgia Weidmann书籍的ping脚本报错求助:Ping unknown host
问题分析与解决
咱们一步步拆解你遇到的问题,逐个解决:
1. 脚本循环逻辑错误导致Ping unknown host
你的脚本里for x in 'seq 1 254'; do这一行有个关键错误:单引号会把seq 1 254当成一个普通字符串,而不是让shell执行这个命令生成1到254的数字序列。循环时$x的值就变成了seq 1 254,最终ping的目标会是192.168.x.x.seq 1 254——这显然是无效的主机地址,自然会提示Ping unknown host。
修复方案:把单引号换成$()(推荐,可读性更强)或者反引号,让shell执行seq命令生成数字序列:
for x in $(seq 1 254); do
2. 脚本运行参数使用错误
你示例里写的./pingscript.sh 192.168.x.x是不对的,这里的x需要替换成你实际的网段号。比如你的XP和Kali在192.168.1.x网段,就应该运行:
./pingscript.sh 192.168.1
这样脚本会自动拼接成192.168.1.1到192.168.1.254去逐个ping。
3. 关于8.8.8.8的疑问
8.8.8.8是Google提供的公共DNS服务器,它既不是你的XP目标机IP,也不是网关地址:
- XP目标机的IP应该是和Kali同网段的私有IP(比如
192.168.1.10) - 网关地址一般是你局域网路由器的IP(比如
192.168.1.1) - 8.8.8.8的作用是解析域名(比如把
google.com转换成对应IP),和你当前的局域网ping扫描脚本没有直接关系,除非你要测试目标机能否访问外网。
修复后的完整脚本
#!/bin/bash if [ "$1" == "" ] then echo "Usage: ./pingscript.sh [network]" echo "example: ./pingscript.sh 192.168.1" else for x in $(seq 1 254); do ping -c 1 $1.$x | grep "64 bytes" | cut -d" " -f4 | sed 's/.$//' done fi
额外优化:如果想让扫描速度更快,可以给ping命令加&让所有ping任务并行执行,最后用wait等待所有任务完成:
#!/bin/bash if [ "$1" == "" ] then echo "Usage: ./pingscript.sh [network]" echo "example: ./pingscript.sh 192.168.1" else for x in $(seq 1 254); do ping -c 1 $1.$x | grep "64 bytes" | cut -d" " -f4 | sed 's/.$//' & done wait fi
内容的提问来源于stack exchange,提问作者wurmh0le
相关产品推荐
相关产品推荐

