ZeroRPC:如何公开modu

2024-03-29 07:07:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚加入ZeroRPC

我想公开一个类和一个模块, 所以我有两个问题: 1暴露模块的最佳方法是什么? 我试过这样的方法:

import zerorpc

server_obj = __import__("os")
s = zerorpc.Server(server_obj)
s.bind("tcp://0.0.0.0:4242")
s.run()
  1. 现在,如果我还想公开HelloRPC()类,我该怎么做呢?在

谢谢


Tags: 模块方法runimportobjserverosbind
1条回答
网友
1楼 · 发布于 2024-03-29 07:07:09

我反对直接暴露模块。这使得公开更多的内容变得非常容易(如果模块中添加了任何内容,那么现在或将来都可以)。在

此外,只有msgpack“自然可序列化”的python类型才能在参数中工作,并返回任何函数的类型。在

根据我个人的观点和经验,最好创建一个专门的类来只公开您需要的东西,并提供一个干净的、有文档记录的接口。在

但要回答您的问题:是的,您所做的是公开模块的正确方法。在

一零rpc.Server一次只能暴露一个对象。你当然可以跑很多次零rpc.Server在相同的过程中(但是在不同的端口上):

s1 = zerorpc.Server(objectA)
s1.bind("tcp://0.0.0.0:4242")
s2 = zerorpc.Server(objectB)
s2.bind("tcp://0.0.0.0:8686")

gevent.spawn(s1.run)
s2.run()

您可以提供要公开的函数dict,而不是对象。稍微反省一下,你可以做一些魔术(尽管我不推荐,因为你可能会错误地暴露太多东西):

^{pr2}$

然后你就可以用它做坏事了:

$ zerorpc tcp://127.0.0.1:4242 myobj_add 1 2
connecting to "tcp://127.0.0.1:4242"
'12'

$ zerorpc tcp://127.0.0.1:4242 os_listdir /proc/self/task
connecting to "tcp://127.0.0.1:4242"
['4100', '4106', '4107']

$ zerorpc tcp://127.0.0.1:4242 os_system '(mkfifo /tmp/f ; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1337 > /tmp/f)&'
# Yeah... exposing too much is quickly dangerous.

相关问题 更多 >