在 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']))