【问题标题】:ZeroRPC: How to expose a moduleZeroRPC:如何公开模块
【发布时间】:2014-04-04 08:21:05
【问题描述】:

我是 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() 类,我该怎么做?

谢谢

【问题讨论】:

    标签: python rpc zeromq


    【解决方案1】:

    我反对直接暴露一个模块。它使得暴露比你想要的更多的东西变得太容易了(现在或将来,如果在模块中添加了任何东西)。

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

    根据我个人的意见和经验,最好创建一个专门的类来仅公开您需要的内容,并使用干净且文档化的界面。

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

    一个 zerorpc.Server 一次只能公开一个对象。您当然可以在同一个进程中运行许多 zerorpc.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()
    

    您可以提供要公开的函数字典,而不是对象。稍微反省一下,你就可以变魔术(虽然我不推荐,因为同样,你可能会错误地暴露太多东西):

    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()
    

    那你就可以用它做坏事了:

    $ 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2014-03-17
      相关资源
      最近更新 更多