我今天早上刚刚在Bash写了一个ping扫描脚本,猜猜是什么:它不起作用。你可以检查一下我错过了什么。
这是脚本:
for i in `seq 1 255`
do
if ["$(ping -c1 -W1 -n 192.168.1.$i | grep '%' | cut -d',' -f3 | cut -d' ' -f2)" -eq "0%"]
then echo "Host live"
else echo "Host down"
fi
done
这是错误:
bash: [0%: command not found
Host down
bash: [100%: command not found
Host down
我的目的是制作ping扫描程序,扫描范围192.168.1.1-255并通知主机的状态。我知道nmap,但只想学习Bash的技能,所以我做了这个。请尝试告诉错误的含义。我的意思是什么命令它指的是“命令未找到”?
答案 0 :(得分:5)
如果有任何问题,ping
命令会返回错误代码,因此您无需解析输出:
for i in {1..255}
do
if ping -c1 -W1 -n "192.168.1.$i"
then
echo 'Host live'
else
echo 'Host down'
fi
done
答案 1 :(得分:4)
[
命令在其名称后面需要一个空格,就像rm
命令在其名称和ls
命令之后需要一个空格一样,并且...... [
命令还要求其最后一个参数为]
,因此拼写,因此在此之前也需要有一个空格。
你有:
if ["$(ping -c1 -W1 -n 192.168.1.$i | grep '%' | cut -d',' -f3 | cut -d' ' -f2)" -eq "0%"]
至少,你需要:
if [ "$(ping -c1 -W1 -n 192.168.1.$i | grep '%' | cut -d',' -f3 | cut -d' ' -f2)" -eq "0%" ]
请注意,“至少”意味着,除其他外,我没有花时间分析为什么在测试条件下执行复杂的4个命令序列,或者寻找将其减少到2个的方法(使用grep
和cut
两次表明sed
或更强大的工具会更好。我抱怨问题的原始版本中的格式,其中循环(它不是嵌套循环,顺便说一句 - 或者它不在显示的代码中)都在一条线上,这要归功于Bash在历史中展平它。例如,我的代码版本中的分号就少得多。 -eq
中的[
运算符用于测试数字的相等性(反向约定适用于Perl,其中eq
用于测试字符串和==
测试数字)。请注意,POSIX标准[
(又名test
)不支持==
作为=
的同义词,尽管Bash会这样做。作为数字比较的参数,"0%"
可以作为参数并不完全清楚。许多程序都不会反对 - 零可以转换,残留无关紧要;其他人可能会合法地决定抱怨整个字符串无法转换,所以这是错误的。谨慎的代码不会有断开连接的风险。
请参阅Steven Penny的answer以更彻底地重写代码。我的答案仍然是对无法找到名为[0%
和[100%
的命令的直接问题的有效诊断。