Python远程过程调用(去掉远程部分)

5
我有一个Python服务器,它不是以root身份运行的,它作为我正在开发的应用程序的前端。然而,有一些应用程序功能需要访问RAW套接字,这意味着需要root权限。
显然,我不想将主服务器作为root运行,所以我的解决方案是创建一个守护进程或命令行脚本,以root身份运行,提供对这些功能的保护访问。
但是,我想放弃stdin/stdout通信,使用类似Pyro的RPC交互方式。但是,这会将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这样的通信层作为请求/响应通道的抽象化实现起来应该很容易。 - Thomas K
3个回答

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

2

0

Pyro有若干安全特性,专门用于限制对RPC接口的访问。这些特性是否会过分拖累性能?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接