传递函数是 RPyC 中的参数
Posted
技术标签:
【中文标题】传递函数是 RPyC 中的参数【英文标题】:Passing functions are parameters in RPyC 【发布时间】:2014-07-19 00:24:32 【问题描述】:我正在尝试将一大堆逻辑封装到一个 Python 函数中,并将其作为参数传递给我想在服务器上执行的远程 RPyC 方法。但 RPyC 将函数视为回调并在本地执行。有办法解决吗?我可以强制服务器在服务器上而不是在客户端上执行它吗?
谢谢。
【问题讨论】:
你能举一个你想运行的函数的例子吗?该函数是已经在服务器进程中定义的,还是一段随机的代码?即使您将完整的函数作为字符串传递,也不可能传递其整个上下文(全局变量、名称绑定、它可能调用的外部包......) 【参考方案1】:teleport_function 允许我将功能从客户端传输到服务器。
http://rpyc.readthedocs.org/en/latest/api/utils_classic.html#rpyc.utils.classic.teleport_function
【讨论】:
【参考方案2】:RPyC 似乎传输int, long, bool, str, float, unicode, bytes, slice, complex, tuple (of simple types), forzenset (of simple types) as well as the following singletons: None, NotImplemented, and Ellipsis
(来自the RPyC manual),因此您可以发送unicode,您可以将代码作为字符串发送,eval 它是服务器端。
请注意,如果您这样做,我将能够在您的服务器上发送os.unlink(sys.argv[0])
之类的内容,或者您可能不想要的此类内容。换句话说,允许服务器运行任意代码是一个巨大的安全漏洞。
因此,如果您在服务器到服务器的情况下,这是可行的,但我认为您并不需要它,如果您完全信任双方,但如果它是客户端-服务器应用程序,那就不行了。
如果您决定采用这种方式,那么 eval 可能不是正确的选择,它会过多地打开您的服务器。你已经探索了一些限制可能性的方法,根据你想让你的bunch of logic
做什么,搜索“python eval security”,你会发现一些有趣的线程。
【讨论】:
Tomer Filiba(RPyC 的作者)指出了库中的 teleport_function,这正是我正在寻找的。span>以上是关于传递函数是 RPyC 中的参数的主要内容,如果未能解决你的问题,请参考以下文章