在 Python 中获取连接的 VPN 名称
Getting Connected VPN Name in Python
我正在尝试检索连接的 VPN 的名称。我是 运行 Fedora 23,所以在 /etc/NetworkManager/system-connections 中很好地列举了连接,其中一个文件列出了 VPN 配置的每个参数,包括我正在寻找的 ID。
但是,此文件仅由 root 拥有和读取(权限为 600),并且每次 VPN 连接启动时都会重新创建,因此更改权限也无济于事。
我只需要可以在 Python 脚本中检索的名称。我什至可以通过读取 /sys/class/net 中的 pid 文件来单独检查它是否处于活动状态。有没有办法在不提升到 root 权限的情况下执行此操作?
您可以使用 python-networkmanager - 它包装了 d-bus(在 debian/ubuntu 上默认 python 它需要安装 python3-dbus
)
import NetworkManager
for conn in NetworkManager.NetworkManager.ActiveConnections:
print('Name: %s; vpn?: %s' % (conn.Id, conn.Vpn))
请注意,几乎所有 类 都只是代理调用,因此有关属性的描述,请查看 d-bus api 文档 - 用于活动连接 https://developer.gnome.org/NetworkManager/unstable/gdbus-org.freedesktop.NetworkManager.Connection.Active.html。
下面是纯 dbus 解决方案 - 稍作修改,NetworkManager 源代码中的示例之一 (git://anongit.freedesktop.org/NetworkManager/NetworkManager.git)
import dbus, sys
bus = dbus.SystemBus()
m_proxy = bus.get_object("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager")
manager = dbus.Interface(m_proxy, "org.freedesktop.NetworkManager")
mgr_props = dbus.Interface(m_proxy, "org.freedesktop.DBus.Properties")
s_proxy = bus.get_object("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings")
settings = dbus.Interface(s_proxy, "org.freedesktop.NetworkManager.Settings")
active = mgr_props.Get("org.freedesktop.NetworkManager", "ActiveConnections")
for a in active:
a_proxy = bus.get_object("org.freedesktop.NetworkManager", a)
a_props = dbus.Interface(a_proxy, "org.freedesktop.DBus.Properties")
name = a_props.Get("org.freedesktop.NetworkManager.Connection.Active", "Id")
vpn = a_props.Get("org.freedesktop.NetworkManager.Connection.Active", "Vpn")
print('Name: %s; vpn?: %s' % (name, vpn))
# to get even more data
#connection_path = a_props.Get("org.freedesktop.NetworkManager.Connection.Active", "Connection")
#c_proxy = bus.get_object("org.freedesktop.NetworkManager", connection_path)
#connection = dbus.Interface(c_proxy, "org.freedesktop.NetworkManager.Settings.Connection")
#settings = connection.GetSettings()
#print("%s (%s)" % (name, settings['connection']))
我正在尝试检索连接的 VPN 的名称。我是 运行 Fedora 23,所以在 /etc/NetworkManager/system-connections 中很好地列举了连接,其中一个文件列出了 VPN 配置的每个参数,包括我正在寻找的 ID。
但是,此文件仅由 root 拥有和读取(权限为 600),并且每次 VPN 连接启动时都会重新创建,因此更改权限也无济于事。
我只需要可以在 Python 脚本中检索的名称。我什至可以通过读取 /sys/class/net 中的 pid 文件来单独检查它是否处于活动状态。有没有办法在不提升到 root 权限的情况下执行此操作?
您可以使用 python-networkmanager - 它包装了 d-bus(在 debian/ubuntu 上默认 python 它需要安装 python3-dbus
)
import NetworkManager
for conn in NetworkManager.NetworkManager.ActiveConnections:
print('Name: %s; vpn?: %s' % (conn.Id, conn.Vpn))
请注意,几乎所有 类 都只是代理调用,因此有关属性的描述,请查看 d-bus api 文档 - 用于活动连接 https://developer.gnome.org/NetworkManager/unstable/gdbus-org.freedesktop.NetworkManager.Connection.Active.html。
下面是纯 dbus 解决方案 - 稍作修改,NetworkManager 源代码中的示例之一 (git://anongit.freedesktop.org/NetworkManager/NetworkManager.git)
import dbus, sys
bus = dbus.SystemBus()
m_proxy = bus.get_object("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager")
manager = dbus.Interface(m_proxy, "org.freedesktop.NetworkManager")
mgr_props = dbus.Interface(m_proxy, "org.freedesktop.DBus.Properties")
s_proxy = bus.get_object("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager/Settings")
settings = dbus.Interface(s_proxy, "org.freedesktop.NetworkManager.Settings")
active = mgr_props.Get("org.freedesktop.NetworkManager", "ActiveConnections")
for a in active:
a_proxy = bus.get_object("org.freedesktop.NetworkManager", a)
a_props = dbus.Interface(a_proxy, "org.freedesktop.DBus.Properties")
name = a_props.Get("org.freedesktop.NetworkManager.Connection.Active", "Id")
vpn = a_props.Get("org.freedesktop.NetworkManager.Connection.Active", "Vpn")
print('Name: %s; vpn?: %s' % (name, vpn))
# to get even more data
#connection_path = a_props.Get("org.freedesktop.NetworkManager.Connection.Active", "Connection")
#c_proxy = bus.get_object("org.freedesktop.NetworkManager", connection_path)
#connection = dbus.Interface(c_proxy, "org.freedesktop.NetworkManager.Settings.Connection")
#settings = connection.GetSettings()
#print("%s (%s)" % (name, settings['connection']))