但是,此文件仅由root拥有和读取(权限为600),并且每次VPN连接启动时都会重新创建,因此更改权限也无济于事.我只需要可以在Python脚本中检索它的名称.我什至可以通过读取/sys/class/net中的pid文件来单独检查它是否处于活动状态.有什么方法可以在不提升到root的情况下完成此操作?解决方案您可以使用 python-networkmanager -它包装了d-bus(在debian/ubuntu上,默认Python需要安装python3-dbus)import NetworkManagerfor 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, sysbus = 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']))I'm trying to retrieve the name of a connected VPN. I'm running Fedora 23, so the connection is nicely enumerated in /etc/NetworkManager/system-connections, with one file that lists out every parameter of the VPN config, including the id which is what I'm looking for.However, this file is owned and readable only by root (permission is 600), and is recreated every time the VPN connection starts, so changing the permissions doesn't help either.I just need the name where I can retrieve it in a Python script. I can even do a separate check to see if it's active by reading the pid file in /sys/class/net. Is there any way to do this without elevating to root? 解决方案 You could use python-networkmanager - it wraps d-bus (on debian/ubuntu with default python it requires to install python3-dbus)import NetworkManagerfor conn in NetworkManager.NetworkManager.ActiveConnections: print('Name: %s; vpn?: %s' % (conn.Id, conn.Vpn))Note that almost all classes are just proxycalls, so for description of properties take look on d-bus api documentation - for active connections https://developer.gnome.org/NetworkManager/unstable/gdbus-org.freedesktop.NetworkManager.Connection.Active.html.And below pure dbus solution - a slightly modified, one of the examples in NetworkManager source (git://anongit.freedesktop.org/NetworkManager/NetworkManager.git)import dbus, sysbus = 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'])) 这篇关于在Python中获得连接的VPN名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 1403页,肝出来的..
09-08 21:18