python通过pid控制局部进程socks5

如题 希望通过识别进程pid 对部分进程实现局部socks5,或其他协议

在 Python 中,你可以使用 psutil 库来识别进程的 PID,然后使用 socket 库来控制网络连接。

首先你可以安装 psutil 库,通过命令行:

pip install psutil

然后导入并使用 psutil.process_iter() 方法来识别你需要控制的进程,并获取它们的 PID。

import psutil

def get_pid_by_name(process_name):
    pid = None
    for process in psutil.process_iter():
        if process.name() == process_name:
            pid = process.pid
    return pid

之后你可以使用 socket 库来实现 SOCKS5 协议。首先,你需要创建一个 socket 对象,并连接到 SOCKS5 代理服务器。然后,使用 SOCKS5 协议规定的格式发送认证和连接请求。

import socket

def socks5_proxy(proxy_ip, proxy_port, target_ip, target_port, pid):
    # Connect to the proxy server
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((proxy_ip, proxy_port))
    # Send the authentication details
    sock.sendall(b'\x05\x01\x00')
    # Receive the response
    resp = sock.recv(2)
    if resp != b'\x05\x00':
        raise Exception('SOCKS5 proxy authentication failed.')
    # Send the connection request
    req = b'\x05\x01\x00\x03' + len(target_ip).to_bytes(1, 'big') + target_ip.encode() + target_port.to_bytes(2, 'big')
    sock.sendall(req)
    # Receive the response
    resp = sock.recv(4)
    if resp[0] != 0x05:
        raise Exception('Not a SOCKS5 proxy.')
    if resp[1] != 0x00:
        raise Exception('SOCKS5 connection failed.')
    # Receive additional data (such as the chosen IP and port for the bound connection)
    extra = sock.recv(resp[3])
    # use the socket for further communication
    # and you can also control it as per your requirements such as closing the connection for specific pid
    #...

现在你可以根据 PID 来控制连接。例如,在你需要关闭某个进程的网络连接时,你可以使用 sock.close() 方法来关闭 socket,关闭该进程的网络连接。

if pid == get_pid_by_name(process_name):
    sock.close()

还有另一个可选的方案,比如通过iptables或者是别的网络代理工具来限制连接,可以按需选择

需要注意的是, 如果你想要代理所有进程的网络连接,那么你需要在系统级别设置代理,而不是在 Python 程序中实现。