我正在尝试创建一个shell脚本来阻止我网络上的所有Apple设备。我正在使用nmap
进行os检测。到目前为止我所拥有的是:
while (true) do
nmap -O -T4 -p 22,80 -v 172.20.0.0/24 | grep -B9 'OS details: Apple' | \
grep 'Nmap scan report for' | cut -f4 -d'r' | cut -f2 -d' ' | \
iptables -i wlan0 -A INPUT -j DROP -s
sleep 10
done
有没有办法简化这一点,以减少涉及的掠过和切割? 此外,如果在网络上找到多个或零个苹果设备,则此脚本将遇到错误。是否可以为此添加逻辑?
答案 0 :(得分:2)
是的,当然有可能。您可以使用perl / awk来简化脚本。
此外,我不确定您的脚本目前是否正确。
你有一个管道写地址到iptables,但iptables
不这样做。
如果您想为iptables
生成的每个地址运行nmap
,
您可以使用read
向某个变量读取地址(在我的示例ADDR
中)
然后使用iptables
中的变量:
while (true) do
nmap -O -T4 -p 22,80 -v 172.20.0.0/24 | grep -B9 'OS details: Apple' | \
grep 'Nmap scan report for' | cut -f4 -d'r' | cut -f2 -d' ' | \
while read ADDR
do
iptables -i wlan0 -A INPUT -j DROP -s $ADDR
done
sleep 10
done
答案 1 :(得分:2)
还有一些评论:
true
周围不需要括号。这会启动一个新的子shell,效率很低。在这种情况下,您可能不会关心,但最好避免不必要的子壳。$ADDR
是危险的。如果$ADDR
包含空格字符,则会将其拆分为单独的参数。网络上的某个人可能会影响NMap的输出,并修改iptables命令的结构。即使这不是这种情况,最好尽可能将参数置于双引号之间以防止这种情况发生:"$ADDR"
。read -r
而不是read
。如果没有-r
参数,输入中的反斜杠字符将转义后续特殊字符(例如空格)。答案 2 :(得分:1)
脚本编写的一个重要部分是了解您正在使用的程序以及如何从中获取适当的输出。看起来您对Nmap有一个很好的理解,因为您限制扫描的端口数(-p 22,80
)并请求操作系统检测(-O
),但是如果使用的话可以避免大量的文本处理appropriate output format。
Nmap的“grepable”格式已被弃用,这意味着它不能用于获取更多近期功能的输出,但它适用于OS检测。您使用-oG
申请。这是一个例子,借用@IgorChubin's excellent answer的一些循环帮助:
while (true) do
nmap -O -T4 -p 22,80 -oG - 172.20.0.0/24 | awk '/OS: Apple/{print $2}' | \
while read ADDR
do
iptables -i wlan0 -A INPUT -j DROP -s $ADDR
done
sleep 10
done
其他一些改进包括将sleep 10
移动到最外层循环的while
条件,以允许在其中一个睡眠期间使用Ctrl-C将其杀死。此外,请注意DHCP租约到期,并且您阻止的IP可能会在将来分配给其他系统。一般来说,这种方法似乎不是实现目标的最佳方式。