Python 远程过程调用(不包含远程部分)

5 投票
3 回答
3124 浏览
提问于 2025-04-16 10:23

我有一个Python服务器,它不是以管理员身份运行,主要是为了支持我正在开发的一个应用。不过,有些应用功能需要访问原始套接字,这就需要管理员权限。

显然,我不想让主服务器以管理员身份运行,所以我的解决方案是创建一个守护进程或者命令行脚本,让它以管理员身份运行,从而安全地提供对这些功能的访问。

不过,我想放弃标准的输入输出通信,而是使用一种类似RPC(远程过程调用)的交互方式,比如Pyro。但这样的话,RPC接口就会暴露给任何能够访问机器网络的人,而我知道调用RPC方法的进程会是同一台机器上的另一个进程。

难道没有一种类似于进程间过程调用的标准,可以在本地机器上使用吗?我想象服务器会做这样的事情:

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

而以管理员身份运行的进程则暴露一个方法:

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

这样的事情有可能实现吗?

3 个回答

0

Pyro有一些特别的安全功能,目的是限制对RPC接口的访问。这样做会不会对性能造成太大的影响呢?

2

这是个简单的问题。你可以通过任何能使用Unix套接字的RPC机制来实现你想要的功能,或者使用普通的TCP套接字,但只接受来自本地回环接口的连接(也就是监听127.0.0.1)。

Python标准库中的多进程库也支持本地进程间通信(IPC)。http://docs.python.org/library/multiprocessing.html#module-multiprocessing.connection

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

撰写回答