Python远程过程调用(没有远程部分)

时间:2011-01-21 17:07:32

标签: python ipc daemon rpc

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

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

但是我想放弃stdin / stdout通信并使用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

这样的事情可能吗?

3 个答案:

答案 0 :(得分:3)

根据我的评论,我有兴趣看看是否有可能,所以我想把它放在一起: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()

答案 1 :(得分:2)

这是一个简单的问题。你应该能够从任何可以使用Unix套接字的RPC机制获得你想要的东西,或者使用常规的TCP套接字但只接受来自loopback接口的连接(监听127.0.0.1)。

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

答案 2 :(得分:0)

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