我有一个没有以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
这样的事情可能吗?
答案 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接口的访问。这些使用是否太大了?