【问题标题】:How to check if rule is already in iptables如何检查规则是否已经在 iptables
【发布时间】:2018-11-14 19:07:31
【问题描述】:

我的 python 脚本有问题,该脚本应该检查是否在 iptables 中编写了某个规则,如果没有将其添加到那里。

def blockip(packet_ip):

   cmd="sudo /sbin/iptables -A INPUT -s "+packet_ip+" -j DROP"
   print cmd

   if ["$(sudo cat /sbin/iptables --list | grep -- packet_ip)"]:
        print "Already Blocked"
    else:
        subprocess.call(cmd,shell=True)
        print packet_ip + " Has been Blocked"

这是我应该处理的函数,但如果满足相同的packet_ip,它就不起作用并在 iptables 中多次写入相同的规则。顺便说一句,在 RPI 上运行,如果有影响的话。

【问题讨论】:

  • if ["$(command)"] 不是在 python 中执行命令的正确方法——看起来你已经将 shell 语法与 python 语法混合在一起了。此外,该命令 greps 字符串 packet_ip 而不是变量的 value
  • 我认为这可能是问题,但我该如何解决?
  • 我认为添加“shell”或类似的东西会使问题更容易被发现和回答。
  • 正如所写,if 语句总是正确的,所以这个函数应该只打印命令然后打印“Already Blocked”。正如你所说,我看不出它是如何做任何其他事情的。
  • 那么应该如何修改它以适应我的目的?我的错误,在我添加 if 语句之前,这确实写了多个规则。之后它会像你说的那样打印“Already Blocked”。

标签: python shell grep raspberry-pi


【解决方案1】:

您需要输入 packet_ip 值作为其名称
正确的代码是:

def blockip(packet_ip):

   cmd=f"sudo /sbin/iptables -A INPUT -s {packet_ip} -j DROP"
   print cmd

   if [f"$(sudo cat /sbin/iptables --list | grep -- {packet_ip})"]:
        print "Already Blocked"
    else:
        subprocess.call(cmd,shell=True)
        print f"{packet_ip} Has been Blocked"

我使用了适用于 python 3.6 或更高版本的较新字符串格式。

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 2021-10-27
    • 2011-12-19
    • 2019-08-21
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多