Python 远程过程调用(不包含远程部分)
我有一个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()