首页 > 解决方案 > 用于 vpn 连接的 python 上下文管理器

问题描述

我正在尝试为 vpn 连接制作一个非常简单的上下文管理器。

我的要求如下:

  1. 极其简单的上下文管理器 API
  2. 跨平台
  3. 完全通过安装pip(不需要sudo apt-get install blah, yay blah, 或者去这个网站下载和运行40个命令类型的东西)

我知道openvpn-api python 包,但它似乎(至少对我来说)不支持典型的配置文件 (*.ovpn),这是我对大多数用户在建立一个(例如)docker 容器上的 VPN。

我的过程是让用户有一个可选的能力来在 git repo 中创建一个*.ovpn文件和一个auth-user-pass文件,这样(如果他们添加这些文件)包将通过他们的 vpn 运行脚本的各个部分。

这是我到目前为止所尝试的:

import subprocess
import sys
with subprocess.Popen(["openvpn", "--config", "my_vpn_config.ovpn"]) as vpn_proc:
    # Do some stuff here, while running all networking though the VPN connection
    
    # This is unnecessary to the program
    #   - just my way of checking that the connection is being used
    #   - (Unfortunately, it does not appear to be running anything through the vpn)
    with subprocess.Popen(["speedtest"], stdout=subprocess.PIPE) as test_proc:
        print(p1.stdout.read())

    # Unfortunately, the context manager doesn't seem to
    #   handle the process closing, or provide a SIGINT/TERM to the process
    # So, we just use this `kill()` function here at the end
    #   of the context manager, out of desperation
    vpn_proc.kill()

我知道我在这里犯了多个错误——至少是以下几点:

  1. subprocess.Popen(["openvpn"])不是( iirc)平台独立的。1a)此外,openvpn作为程序的使用需要在外部安装pip- 我强烈反对要求用户
  2. 上下文管理器不处理 openvpn 进程的终止
  3. VPN 实际上似乎并未用于任何互联网流量

我之前设置了一些自定义上下文管理器,但是由于使用了子进程,这对我来说似乎有点回避。

我愿意使用类似openvpn-api包装的东西,只要它适合。不幸的是,我只是不明白如何正确使用其中一些工具

也许有人对此有更简单的建议?

标签: pythonnetworkingsubprocessopenvpncontextmanager

解决方案


推荐阅读