【问题标题】:Getting Connected VPN Name in Python在 Python 中获取连接的 VPN 名称
【发布时间】:2016-04-23 20:52:24
【问题描述】:

我正在尝试检索已连接 VPN 的名称。我正在运行 Fedora 23,因此在 /etc/NetworkManager/system-connections 中很好地枚举了连接,其中一个文件列出了 VPN 配置的每个参数,包括我正在寻找的 id。

但是,这个文件只有 root 拥有和读取(权限为 600),并且每次 VPN 连接启动时都会重新创建,因此更改权限也无济于事。

我只需要可以在 Python 脚本中检索它的名称。我什至可以通过读取 /sys/class/net 中的 pid 文件来单独检查它是否处于活动状态。有没有办法在不提升到 root 的情况下做到这一点?

【问题讨论】:

  • 该文件可读吗?你应该只需要root来写,不是吗?
  • 出于某种原因,也只能由 root 读取。

标签: python linux python-3.x fedora vpn


【解决方案1】:

您可以使用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']))

【讨论】:

  • 正是我需要的,谢谢! NetworkManager 完美运行。
  • 我在谷歌搜索时遇到了这个,但运行它给了我 dbus not enough memory 错误,知道吗?
猜你喜欢
  • 2012-05-11
  • 2011-07-16
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2015-03-08
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多