2011-01-21 9 views
4

私は開発中のアプリケーションの前にあるルートとして実行されていないPythonサーバーを持っています。しかし、root特権を意味するRAWソケットへのアクセスを必要とするいくつかのアプリケーション機能があります。Pythonリモートプロシージャコール(リモートパートなし)

明らかに私は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 

はこの可能ようなものです私は、サーバーがこのような何かをやって想像しますか?

+0

あらかじめ書いてあることは分かりませんが、zmqのような通信レイヤーを使用して実装することは、要求/応答チャネルの抽象化としては簡単にできると思います。 –

答えて

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

Pyroには、特にRPCインターフェイスへのアクセスを制限するためにa number of security featuresがあります。これらは、使用するにはあまりにも多くのパフォーマンスの負担ですか?私のコメントに続いて

2

これは簡単な問題です。あなたは、Unixソケットを使うことができるRPCメカニズムか、通常のTCPソケットを使うことができますが、ループバックインターフェイス(127.0.0.1で待ち受ける)からの接続だけを受け入れることができます。

Python標準ライブラリのマルチプロセッシングライブラリもローカルIPCをサポートしています。 http://docs.python.org/library/multiprocessing.html#module-multiprocessing.connection

関連する問題