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