首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZeroRPC:如何公开模块

ZeroRPC:如何公开模块
EN

Stack Overflow用户
提问于 2014-03-03 10:24:43
回答 1查看 1.1K关注 0票数 2

我是新来的ZeroRPC,

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

代码语言:javascript
复制
import zerorpc

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-03 22:17:33

我反对直接公开一个模块。它使得公开比您想要的内容更容易(无论是现在还是将来,如果在模块中添加了任何内容)。

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

基于我的唯一意见和经验,最好是创建一个专用的类,只公开您需要的内容,并提供一个干净的文档化的接口。

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

一个zerorpc.Server一次只能公开一个对象。当然,您可以在相同的进程中运行许多zerorpc.Server (但是在不同的端口上):

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
import zerorpc
import os

# extract any public callable.
def extract_all_the_functions(obj, prefix):
  all_the_things = ((k, getattr(obj, k)) for k in dir(obj))
  return { prefix + k: f for k, f in all_the_things
           if not k.startswith('_') and callable(f) }

class MyObject(object):
  def add(self, a, b):
    return a + b

funcs = extract_all_the_functions(os, 'os_')
funcs.update(extract_all_the_functions(MyObject(), 'myobj_'))
s = zerorpc.Server(funcs)
s.bind('tcp://127.0.0.1:4242')
s.run()

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

代码语言:javascript
复制
$ 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.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22144168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档