gpt4 book ai didi

python - 如何将 python 函数复制到远程计算机然后执行它?

转载 作者:太空狗 更新时间:2023-10-29 21:51:09 24 4
gpt4 key购买 nike

我正在尝试在 Python 3 中创建一个结构,使我能够轻松地在远程计算机上执行一个函数。假设我已经有了一个 python tcp 服务器,它将运行它接收到的函数,在远程服务器上运行,我目前正在考虑使用像

这样的装饰器
@execute_on(address, port)

这将创建执行它正在装饰的函数所需的必要上下文,然后将函数和上下文发送到远程计算机上的 tcp 服务器,然后由远程计算机执行它。首先,这有点理智吗?如果不能,您能推荐一种更好的方法吗?我进行了一些谷歌搜索,但没有找到满足这些需求的任何内容。

我有一个用于 tcp 服务器和客户端的快速但肮脏的实现,所以相当肯定它会起作用。我可以通过

获得传递给装饰器的函数(例如 func)的字符串表示
import inspect
string = inspect.getsource(func)

然后可以将其发送到可以执行的服务器。问题是,如何获取函数执行所需的所有上下文信息?例如,如果 func 定义如下,

import MyModule
def func():
result = MyModule.my_func()

MyModule 需要在全局上下文或远程服务器上的 funcs 本地上下文中对 func 可用。在这种情况下,这相对微不足道,但根据何时以及如何使用 import 语句,它可能会变得更加复杂。在 Python 中是否有一种简单而优雅的方法来做到这一点?我目前想出的最好办法是使用 ast 库提取所有导入语句,使用检查模块获取这些模块的字符串表示,然后在远程服务器上重建整个上下文。不是特别优雅,我可以看到很多错误的空间。

谢谢你的时间

最佳答案

除非远程服务器以某种方式受到非常严格的保护或“极其沙盒化”(例如 BSD“ jail ”),否则您概述的方法风险极大——任何可以向其发送函数的人都可以在那里运行任意代码。

假设您有一个您完全信任的身份验证系统,就会出现您意识到的“脆弱性”问题——函数可以依赖于执行时在其模块中定义的任何全局变量(这可能与您可以定义的不同)通过检查检测:在执行时确定导入模块的集合,更一般地说是全局变量的集合,是一个图灵完备的问题)。

您可以通过序列化函数的全局变量以及函数本身来处理全局变量问题,在您将它发送到远程执行时(无论您以可读字符串形式序列化所有这些东西,还是其他方式,都是小问题)。但这仍然会给您留下函数内执行导入的问题。

除非您愿意对“远程”函数施加一些限制,例如“函数内部没有导入(以及从中调用的函数)”,我认为您可以服务器覆盖 __import__(所有 import 语句使用的内置函数,旨在根据特殊需求覆盖,例如您的需求;-)以从发送客户端请求额外的模块(当然,这要求所述客户端也具有“类似服务器”的能力,因为它必须能够响应来自服务器的此类“模块请求”)。

你不能对远程函数施加一些限制,使这个任务回到理智的领域......?

关于python - 如何将 python 函数复制到远程计算机然后执行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com