当我唤醒计算机时,互联网会自动重新连接,但 VPN 不会。
是否可以使其自动重新连接(使用 KDE 上的网络管理器,或者至少以网络管理器知道是否通过 VPN 连接的方式)?
答案1
我在 Ubuntu 论坛上找到了这个解决方案(例如,这里):
以提升的权限启动文本编辑器。例如,在命令提示符下输入:
gksudo gedit
您需要以提升的权限运行编辑器,因为您将文件保存在无法使用“正常”访问级别进行更改的文件夹中。
创建一个名为 的文件
autovpn
并将其保存在目录中/etc/NetworkManager/dispatcher.d
。在此autovpn
文件中,放置以下代码:#!/usr/bin/python import sys import os import dbus import gobject from dbus.mainloop.glib import DBusGMainLoop # The uuid of the VPN connection to activate VPN_CONNECTION_UUID = "FILL IN YOUR OWN" # The uuid of the connection that needs to be active to start the VPN connection ACTIVE_CONNECTION_UUID = "FILL IN YOUR OWN" # some service, path and interface constants NM_DBUS_SERVICE = "org.freedesktop.NetworkManager" NM_DBUS_PATH = "/org/freedesktop/NetworkManager" NM_DBUS_INTERFACE = "org.freedesktop.NetworkManager" NM_DBUS_IFACE_CONNECTION_ACTIVE = "org.freedesktop.NetworkManager.Connection.Active" NM_DBUS_SERVICE_SYSTEM_SETTINGS = "org.freedesktop.NetworkManagerSystemSettings" NM_DBUS_SERVICE_USER_SETTINGS = "org.freedesktop.NetworkManagerUserSettings" NM_DBUS_IFACE_SETTINGS = "org.freedesktop.NetworkManagerSettings" NM_DBUS_PATH_SETTINGS = "/org/freedesktop/NetworkManagerSettings" NM_DBUS_IFACE_SETTINGS_CONNECTION = "org.freedesktop.NetworkManagerSettings.Connection" DBusGMainLoop(set_as_default=True) nm_dbus_settings_services = (NM_DBUS_SERVICE_SYSTEM_SETTINGS, NM_DBUS_SERVICE_USER_SETTINGS) def get_connections(bus, service): proxy = bus.get_object(service, NM_DBUS_PATH_SETTINGS) iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS) return iface.ListConnections() def get_connection_by_uuid(bus, uuid): for service in nm_dbus_settings_services: for c in get_connections(bus, service): proxy = bus.get_object(service, c) iface = dbus.Interface(proxy, dbus_interface = NM_DBUS_IFACE_SETTINGS_CONNECTION) settings = iface.GetSettings() if settings['connection']['uuid'] == uuid: return (c, service) return None def list_uuids(bus): for service in nm_dbus_settings_services: for c in get_connections(bus, service): proxy = bus.get_object(service, c) iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION) settings = iface.GetSettings() conn = settings['connection'] print " %s: %s - %s (%s)" % (service, conn['uuid'], conn['id'], conn['type']) def get_active_connection_path(bus, uuid): proxy = bus.get_object(NM_DBUS_SERVICE, NM_DBUS_PATH) iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties') active_connections = iface.Get(NM_DBUS_INTERFACE, 'ActiveConnections') connection_and_service = get_connection_by_uuid(bus, uuid) if connection_and_service == None: return None for a in active_connections: proxy = bus.get_object(NM_DBUS_SERVICE, a) iface = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Properties') path = iface.Get(NM_DBUS_IFACE_CONNECTION_ACTIVE, 'Connection') service = iface.Get(NM_DBUS_IFACE_CONNECTION_ACTIVE, 'ServiceName') if service != connection_and_service[1]: continue proxy = bus.get_object(connection_and_service[1], path) iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_IFACE_SETTINGS_CONNECTION) settings = iface.GetSettings() if settings['connection']['uuid'] == uuid: return a return None def activate_connection(bus, vpn_connection, active_connection): def reply_handler(opath): print "<<SUCCESS>>" sys.exit(0) def error_handler(*args): print "<<FAILURE>>" sys.exit(1) proxy = bus.get_object(NM_DBUS_SERVICE, NM_DBUS_PATH) iface = dbus.Interface(proxy, dbus_interface=NM_DBUS_INTERFACE) iface.ActivateConnection(NM_DBUS_SERVICE_USER_SETTINGS, vpn_connection[0], dbus.ObjectPath("/"), active_connection, reply_handler=reply_handler, error_handler=error_handler) bus = dbus.SystemBus() #print "connections:" #list_uuids(bus) if len(VPN_CONNECTION_UUID) < 1 or len(ACTIVE_CONNECTION_UUID) < 1: print "you need to set the uuids" sys.exit(0) vpn_connection = get_connection_by_uuid(bus, VPN_CONNECTION_UUID) if not vpn_connection: print "Configured VPN connection is not known to NM, check VPN_CONNECTION_UUID." sys.exit(1) active_connection = get_connection_by_uuid(bus, ACTIVE_CONNECTION_UUID) if not active_connection: print "Configured active connection is not known to NM, check ACTIVE_CONNECTION_UUID." sys.exit(1) if get_active_connection_path(bus, VPN_CONNECTION_UUID) != None: print "VPN connection already activated" sys.exit(0) active_connection_path = get_active_connection_path(bus, ACTIVE_CONNECTION_UUID) if not active_connection_path: print "The required connection isn't active at the moment" sys.exit(0) print "connecting...." # to:\n '%s'\nwith active connection:\n '%s'" % (vpn_connection, active_connection) activate_connection(bus, vpn_connection, active_connection_path) loop = gobject.MainLoop() loop.run()
转到命令提示符。运行以下命令:
nmcli con status
记下给定的 UUID 值,例如,将它们复制并粘贴到文本文件中。
返回
autovpn
脚本:填写您要使用的 VPN 连接的 UUID,以及在连接到 VPN 之前必须处于活动状态的连接。对于大多数用户来说,第二个是默认网络连接,通常是有线以太网连接。
请注意,UUID 值对于您的系统来说是唯一的。但是,他们不应该在登录之间进行更改,否则此脚本将无法工作。以下是我看到的,供大家参考:
$ nmcli con status NAME UUID DEVICES DEFAULT VPN Wired connection 1 e9908d28-ffec-41cd-babb-c0cefb38ae6a eth0 yes no VPN Connection 699f17f2-0ab0-4d1d-94d3-24136ef81603 -- no yes
保存
autovpn
文件。注销并重新登录或重新启动。一旦您的常规网络连接打开,您的 VPN 连接就会立即激活。
下一步:实现脚本自动检测VPN是否仍然连接,如果没有则重新连接。
希望这对您有一些帮助。