写了一个python脚本,通过统计iptables里是否有某个端口的策略,判断某个端口是否开启。如果没开启的话,就打开该端口。
原始的shell命令是:iptables -L -n -v | grep -w 161 | wc -l
然后发现,在执行的过程中,端口被开放了多次,iptables里有很多开放同一个端口的策略,我百思不得其解,明明代码里统计了端口是否开放,为什么还在重复开放端口。开始以为是os.popen的原因,怀疑os.popen没有获取到shell命令执行的结果。后来又想,如果os.popen有问题,那不很多代码都有问题,应该不是os.popen的问题。再后来看到同事修复一个类似的bug,才了解到,可能是多个进程同时想获取iptables的锁,导致我的统计命令没有获取到对应的锁,导致统计命令实际没有执行,所以没有获取到值。后来就把shell命令改成以下形式
port_count = int((os.popen('iptables -L -n -v -w 1| grep -w 161 | wc -l').readlines()[0].rsplit(" "))[0])
if port_count == 0:
os.system("/usr/sbin/iptables -I INPUT -p udp --dport 161 -j ACCEPT")
port_count = int((os.popen('ip6tables -L -n -v -w 1| grep -w 161 | wc -l').readlines()[0].rsplit(" "))[0])
if port_count == 0:
os.system("/usr/sbin/ip6tables -I INPUT -p udp --dport 161 -j ACCEPT")
iptables -w [seconds] maximum wait to acquire xtables lock before give up
版权声明:本文为bluekrystal原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。