Linux Bash脚本阻止所有Apple设备
我正在尝试创建一个shell脚本来阻止我网络上的所有苹果设备。我正在使用Linux Bash脚本阻止所有Apple设备,linux,bash,iptables,nmap,Linux,Bash,Iptables,Nmap,我正在尝试创建一个shell脚本来阻止我网络上的所有苹果设备。我正在使用nmap进行操作系统检测。到目前为止,我得到的是: 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 wla
nmap
进行操作系统检测。到目前为止,我得到的是:
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
有没有一种方法可以简化这一过程,从而减少所涉及的渲染和剪切?
此外,如果在网络上找到多个或零个apple设备,则此脚本将出错。是否可以为此添加逻辑?是的,当然可以。可以使用perl/awk大大简化脚本 另外,我现在不确定你的脚本是否正确。 您有一个将地址写入iptables的管道,但是
iptables
这样不行
如果要为nmap
生成的每个地址运行iptables
,
您可以使用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
脚本编写的一个重要部分是了解您正在使用的程序以及如何从中获得适当的输出。看起来您对Nmap有了相当的了解,因为您限制了扫描的端口数(
-p 22,80
)和请求操作系统检测(-O
),但是如果您使用
Nmap的“grepable”格式已被弃用,这意味着它不能用于获取更多最新功能的输出,但对于操作系统检测来说,它工作得很好。您可以使用-oG
请求它。下面是一个示例,从以下位置借用一些循环帮助:
其他一些改进包括将sleep 10
移动到最外层循环的while
状态,以允许在其中一个睡眠期间使用Ctrl-C终止它。另外,请注意DHCP租约将过期,并且您正在阻止的IP将来可能会分配给不同的系统。总的来说,这种方法似乎不是实现您想要的目标的最佳方法。还有几点需要说明:
周围不需要括号。这将启动一个新的子shell,这是低效的。在这种情况下,您可能不会在意,但最好避免不必要的子shelltrue
- 中的
是危险的。如果$ADDR
包含一个空格字符,它将被拆分为单独的参数。网络上的某个人可能会影响NMap的输出,并修改iptables命令的结构。即使这里不是这样,最好尽可能将参数放在双引号之间,以防止出现这种情况:$ADDR
“$ADDR”
- 出于类似的原因,您通常希望使用
,而不仅仅是read-r
。如果没有read
参数,输入中的反斜杠字符将转义后续特殊字符(如空格)-r
- NMap有自己的Lua脚本支持。这是解决这个问题的另一种方法,它可以防止您解析任何文本
- 如果您物理上在同一网络上,则可以根据设备的MAC地址阻止设备,从而在没有任何NMap的情况下阻止Apple设备。前三个字节标识发布MAC地址的组织。你可以查一下。它们可以在根设备上伪造,但NMap指纹也可以伪造(尽管这可能更难)
while/read
。请看我的update@735Tesla:ADDR
不能为空,因为在这种情况下,do/done内的循环体将不会执行。在这种情况下,Read将重新运行false。好的,谢谢您的帮助!你能告诉我一个资源,可以帮助我学习我需要的技能来简化这一点吗?是的。我推荐这个:谢谢,反正我也不会经常用这个。更多用于烦人的朋友和家人等-oG
非常有用,谢谢你的提示+1.
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