2024-03-29 07:07:09 发布
网友
我刚加入ZeroRPC
我想公开一个类和一个模块, 所以我有两个问题: 1暴露模块的最佳方法是什么? 我试过这样的方法:
import zerorpc server_obj = __import__("os") s = zerorpc.Server(server_obj) s.bind("tcp://0.0.0.0:4242") s.run()
谢谢
我反对直接暴露模块。这使得公开更多的内容变得非常容易(如果模块中添加了任何内容,那么现在或将来都可以)。在
此外,只有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,而不是对象。稍微反省一下,你可以做一些魔术(尽管我不推荐,因为你可能会错误地暴露太多东西):
然后你就可以用它做坏事了:
$ 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.
我反对直接暴露模块。这使得公开更多的内容变得非常容易(如果模块中添加了任何内容,那么现在或将来都可以)。在
此外,只有msgpack“自然可序列化”的python类型才能在参数中工作,并返回任何函数的类型。在
根据我个人的观点和经验,最好创建一个专门的类来只公开您需要的东西,并提供一个干净的、有文档记录的接口。在
但要回答您的问题:是的,您所做的是公开模块的正确方法。在
一零rpc.Server一次只能暴露一个对象。你当然可以跑很多次零rpc.Server在相同的过程中(但是在不同的端口上):
您可以提供要公开的函数dict,而不是对象。稍微反省一下,你可以做一些魔术(尽管我不推荐,因为你可能会错误地暴露太多东西):
^{pr2}$然后你就可以用它做坏事了:
相关问题 更多 >
编程相关推荐