通过 Python 的 dbus 模块控制 CentOS 中的 firewalld?
Control firewalld in CentOS via Python's dbus module?
我的目标是使用 Python.
在 CentOS 7 台机器上自动配置防火墙
OS 自带 firewalld,所以这就是我正在使用的。我调查了一下,发现它使用了 dbus(我从未听说过或处理过这些 - 如果我说的不正确,请纠正我。)
我找到了关于如何使用 Python 控制 dbus 进程的文档:
http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.txt
我查了一下 OS 附带的 Python 版本包含 dbus
模块,所以这似乎是一个很有希望的开始。
该文档建议我需要更多地了解 firewalld 通过 dbus 接口公开的内容。所以我做了更多的研究,发现了这个:
https://www.mankier.com/5/firewalld.dbus
第一份文件说我需要从 "well-known name" 开始。他们的例子是 org.freedesktop.NetworkManager
。第二份文件的标题是 firewalld.dbus
,所以我认为这是一个可以尝试的任何名称,因为该文件没有在其他任何地方明确给出名称。
第一个文档还说我需要一个 object 路径的名称。他们的例子是/org/freedesktop/NetworkManager
。第二个文档的 object 路径为 /org/fedoraproject/FirewallD1
.
我将它们放在一起并尝试使用第一个文档建议的第一种方法,SystemBus
's get_object()
:
>>> from dbus import SystemBus
>>> bus = SystemBus()
>>> proxy = bus.get_object('firewalld.dbus', '/org/fedoraproject/FirewallD1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 241, in get_object
follow_name_owner_changes=follow_name_owner_changes)
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 248, in __init__
self._named_service = conn.activate_name_owner(bus_name)
File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 180, in activate_name_owner
self.start_service_by_name(bus_name)
File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 278, in start_service_by_name
'su', (bus_name, flags)))
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException:
org.freedesktop.DBus.Error.ServiceUnknown:
The name firewalld.dbus was not provided by any .service files
我也试过 org.fedoraproject.FirewallD1
作为第一个参数,但最终得到了类似的错误消息。
为什么这些不起作用?有什么方法可以让我发现专有名称是什么?它在错误消息的末尾提到“.service 文件”...这样的文件位于何处?
编辑:使用find / -name *.service
找到了几个“.service 文件”。其中之一在 /usr/lib/systemd/system/firewalld.service
... 看起来很有前途,所以我会检查一下。
编辑 2:这是一个相当短的文件……只有大约 10 行。其中一位说 BusName=org.fedoraproject.FirewallD1
。所以我不确定为什么它说该名称不是由任何 .service 文件提供的...除非它出于某种原因没有使用该文件?
如果单元文件说:
BusName=org.fedoraproject.FirewallD1
那么也许您应该尝试使用它作为您的巴士名称:
>>> import dbus
>>> bus = dbus.SystemBus()
>>> p = bus.get_object('org.fedoraproject.FirewallD1', '/org/fedoraproject/FirewallD1')
>>> p.getDefaultZone()
dbus.String(u'FedoraWorkstation')
我根据以下事实得出了这个结论:
>>> help(bus.get_object)
说 get_object
调用看起来像:
get_object(self, bus_name, object_path, introspect=True, follow_name_owner_changes=False, **kwargs)
我的目标是使用 Python.
在 CentOS 7 台机器上自动配置防火墙OS 自带 firewalld,所以这就是我正在使用的。我调查了一下,发现它使用了 dbus(我从未听说过或处理过这些 - 如果我说的不正确,请纠正我。)
我找到了关于如何使用 Python 控制 dbus 进程的文档: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.txt
我查了一下 OS 附带的 Python 版本包含 dbus
模块,所以这似乎是一个很有希望的开始。
该文档建议我需要更多地了解 firewalld 通过 dbus 接口公开的内容。所以我做了更多的研究,发现了这个: https://www.mankier.com/5/firewalld.dbus
第一份文件说我需要从 "well-known name" 开始。他们的例子是 org.freedesktop.NetworkManager
。第二份文件的标题是 firewalld.dbus
,所以我认为这是一个可以尝试的任何名称,因为该文件没有在其他任何地方明确给出名称。
第一个文档还说我需要一个 object 路径的名称。他们的例子是/org/freedesktop/NetworkManager
。第二个文档的 object 路径为 /org/fedoraproject/FirewallD1
.
我将它们放在一起并尝试使用第一个文档建议的第一种方法,SystemBus
's get_object()
:
>>> from dbus import SystemBus
>>> bus = SystemBus()
>>> proxy = bus.get_object('firewalld.dbus', '/org/fedoraproject/FirewallD1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 241, in get_object
follow_name_owner_changes=follow_name_owner_changes)
File "/usr/lib64/python2.7/site-packages/dbus/proxies.py", line 248, in __init__
self._named_service = conn.activate_name_owner(bus_name)
File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 180, in activate_name_owner
self.start_service_by_name(bus_name)
File "/usr/lib64/python2.7/site-packages/dbus/bus.py", line 278, in start_service_by_name
'su', (bus_name, flags)))
File "/usr/lib64/python2.7/site-packages/dbus/connection.py", line 651, in call_blocking
message, timeout)
dbus.exceptions.DBusException:
org.freedesktop.DBus.Error.ServiceUnknown:
The name firewalld.dbus was not provided by any .service files
我也试过 org.fedoraproject.FirewallD1
作为第一个参数,但最终得到了类似的错误消息。
为什么这些不起作用?有什么方法可以让我发现专有名称是什么?它在错误消息的末尾提到“.service 文件”...这样的文件位于何处?
编辑:使用find / -name *.service
找到了几个“.service 文件”。其中之一在 /usr/lib/systemd/system/firewalld.service
... 看起来很有前途,所以我会检查一下。
编辑 2:这是一个相当短的文件……只有大约 10 行。其中一位说 BusName=org.fedoraproject.FirewallD1
。所以我不确定为什么它说该名称不是由任何 .service 文件提供的...除非它出于某种原因没有使用该文件?
如果单元文件说:
BusName=org.fedoraproject.FirewallD1
那么也许您应该尝试使用它作为您的巴士名称:
>>> import dbus
>>> bus = dbus.SystemBus()
>>> p = bus.get_object('org.fedoraproject.FirewallD1', '/org/fedoraproject/FirewallD1')
>>> p.getDefaultZone()
dbus.String(u'FedoraWorkstation')
我根据以下事实得出了这个结论:
>>> help(bus.get_object)
说 get_object
调用看起来像:
get_object(self, bus_name, object_path, introspect=True, follow_name_owner_changes=False, **kwargs)