【问题标题】:Python Remote Procedure Call (Without the Remote Part)Python 远程过程调用(没有远程部分)
【发布时间】:2011-06-13 07:04:15
【问题描述】:

我有一个没有以 root 身份运行的 Python 服务器,它面向我正在开发的应用程序。但是,有些应用程序功能需要访问 RAW 套接字,这意味着 root 权限。

显然我不想以 root 身份运行主服务器,因此我的解决方案是创建一个以 root 身份运行的守护进程或命令行脚本,以提供对所述功能的保护访问。

但是我想抛开标准输入/标准输出通信并使用 RPC 交互方式,例如Pyro。但这会将 RPC 接口暴露给任何可以通过网络访问机器的人,而我知道调用 RPC 方法的进程将是同一台机器上的另一个进程。

难道没有一种进程间过程调用标准可以以类似的方式(仅限本地机器)使用吗?我想象服务器在做这样的事情:

# Server not running as root
pythonically, returned, values = other_process_running_as_root.some_method()

并且以root身份运行的进程暴露了一个方法:

# Daemon running as root
@expose_this_method
def some_method():
    # Play with RAW sockets
    return pythonically, returned, values

这样的事情可能吗?

【问题讨论】:

  • 我不知道任何预先写好的东西,但我认为使用像 zmq 这样的通信层来实现它会很容易,作为围绕请求/回复通道的抽象。

标签: python ipc daemon rpc


【解决方案1】:

根据我的评论,我很想看看这是否可能,所以我尝试将其放在一起:https://github.com/takowl/ZeroRPC

请记住,这是在一个小时左右的时间内完成的,因此它几乎肯定不如任何严肃的解决方案(例如,服务器端的任何错误都会使其崩溃......)。但它可以按照您的建议工作:

服务器:

rpcserver = zerorpc.Server("ipc://myrpc.ipc")

@rpcserver.expose
def product(a, b):
    return a * b

rpcserver.run()

客户:

rpcclient = zerorpc.Client("ipc://myrpc.ipc")

print(rpcclient.product(5, 7))
rpcclient._stopserver()

【讨论】:

    【解决方案2】:

    这是一个简单的问题。您应该能够从任何可以使用 Unix 套接字或使用常规 TCP 套接字但只接受来自环回接口的连接(监听 127.0.0.1)的 RPC 机制获得所需的内容。

    Python 标准库中的多处理库也支持本地 IPC。 http://docs.python.org/library/multiprocessing.html#module-multiprocessing.connection

    【讨论】:

      【解决方案3】:

      Pyro 有a number of security features 专门用于限制对 RPC 接口的访问。使用这些性能负担是否太大?

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多