首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python3循环在Firewalld中添加富规则

使用Python3循环在Firewalld中添加富规则
EN

Stack Overflow用户
提问于 2018-03-09 01:58:48
回答 1查看 1K关注 0票数 1

我试图使用Python3来迭代IP地址列表,然后使用firewalld阻止它们。

注意:我是Python的新手,所以请原谅任何简单的错误。

代码语言:javascript
复制
import subprocess

with open("ips.txt") as ipList:
ips = ipList.readlines()

for ip in ips:
    process = subprocess.Popen(['firewall-cmd',
                            '--permanent',
                            '--add-rich-rule=\'rule family=\"ipv4\" source address=\"{0}\" reject\''.format(ip.rstrip())
                            ])

我使用format.rstrip删除列表中每个IP地址后的换行。

当运行脚本时,我会收到以下错误;

代码语言:javascript
复制
root@mediaserver:~# python3 block.py 
Error: INVALID_RULE: internal error in _lexer(): rule family="ipv4" source address="1.56.0.0/13" reject
Error: INVALID_RULE: internal error in _lexer(): rule family="ipv4" source address="1.48.0.0/15" reject

此错误消息迭代我列表中的所有IP块。

如果我在脚本之外运行防火墙-cmd,我不会收到任何错误消息,并且正确地添加了规则。

代码语言:javascript
复制
root@mediaserver:~# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="223.198.0.0/15" reject'
success
root@mediaserver:~# firewall-cmd --reload
success
root@mediaserver:~# firewall-cmd --zone=public --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
       rule family="ipv4" source address="223.198.0.0/15" reject

root@mediaserver:~# iptables -L IN_public_deny
Chain IN_public_deny (1 references)
target     prot opt source               destination         
REJECT     all  --  223.198.0.0/15       anywhere             reject-with icmp-port-unreachable


root@mediaserver:~# which python3
/usr/bin/python3

root@mediaserver:~# firewall-cmd --version
0.3.7

我认为这个问题可能与我如何在python脚本中转义字符有关,但据我所知,它们被正确地转义了。如果有任何额外的调试信息,我可以提供,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-09 20:23:12

解决方案是多部分的。我们通过声明命令参数的一部分并使用行延拓将所有内容分开来组织格式化。这有助于保持所有的组织和减少字符转义错误。此外,我们从Popen切换到运行,因为Popen对此使用过度,并将shell=True值添加到我们的子流程中。

代码语言:javascript
复制
import subprocess

with open("ips.txt") as ip_list:
    ips = ip_list.readlines()

ips = (ip.strip() for ip in ips)
rules = ('rule family="ipv4" source address="{0}" reject'.format(ip) for ip in ips)

for rule in rules:
    process = subprocess.run("firewall-cmd "
                          "--permanent "
                          " --add-rich-rule=\'{0}\'".format(rule),
                          shell=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49185476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档