gdb/pyseidon
GitHub: gdb/pyseidon
Pyseidon 通过 fork 机制实现 Python 工作负载的「一次加载、多次运行」,让需要频繁启动的 Python 脚本跳过重复的初始化阶段。
Stars: 39 | Forks: 1
# Pyseidon:基于 fork 的“一次加载,多次运行” Python server

Pyseidon 为任何 Python 工作负载实现了一种“一次加载,多次运行”的范式。当你每次启动进程时都需要进行缓慢的固定设置,随后再执行一些动态变化的工作负载,使用它来加快加载时间会非常有用。
一个常见的用例是预加载一些加载缓慢且很少变动的依赖项;此外,你也可以用它来一次性预加载一个大型数据集。
Pyseidon 的工作原理是启动一个执行一次性设置的 server 进程;随后你可以动态地将 client 连接到该 server,这会促使 server 进行 fork 并在生成的 subprocess 中运行你的工作负载。
作为用户,这感觉就像是在运行一个 Python 脚本,但一次性设置只会发生一次。
[Poseidon](https://github.com/stripe-ctf/poseidon) 是同一概念的 Ruby 实现。
# 安装
你可以通过 `pip` 安装:
```
pip install pyseidon
```
或者你可以从源码安装:
```
git clone https://github.com/gdb/pyseidon
pip install -e pyseidon
cd pyseidon/client && make
```
# 如何使用
- 创建并运行一个 Pyseidon server 进程:
```
$ cat < server.py
import pyseidon
import sys
def handler():
print(f'Hi from worker. Your client ran with args: {sys.argv}')
pyseidon = pyseidon.Pyseidon()
pyseidon.run(handler)
EOF
$ python server.py
```
- 通过提供的 client 连接到该 server 进程:
```
$ pyseidon a b c
Hi from worker. Your client ran with args: ['a', 'b', 'c']
```
# 运行机制
Pyseidon 的工作原理是让 client 将其 stdin、stdout 和 stderr file descriptors 发送给由 server 生成的 worker 进程。其工作流程如下:
- Pyseidon server 接受来自 client 的连接,并 fork 出一个 worker。
- client 将其 argv、当前工作目录以及它的 stdin、stdout、stderr file descriptors 发送过去。
- worker 安装这些 file descriptors,cd 到该工作目录,然后执行 server 提供的 handler。
由于 worker 是从 server fork 出来的,它对 server 地址空间中的所有变量和代码拥有完全的 copy-on-write 访问权限。这意味着它可以访问已由 server 加载的任何数据集(并且可以随意篡改该数据或加载新代码,而无需担心)。
# 待办事项
- 从 client 转发信号
- 用 Rust 重写 client
- 寻找一种更不那么 hacky 的方式来编译 client
标签:Python, SOC Prime, 可视化界面, 开发工具, 性能优化, 无后门, 服务端, 检测绕过, 逆向工具, 预热加载