2013-07-01 22 views
6

私はpython-daemonパッケージを使用して、pythonでデーモンを作成しています。デーモンはブート時に起動され(init.d)、さまざまなデバイスにアクセスする必要があります。 デーモンは、ubuntuを実行している組み込みシステム(beaglebone)で実行します。非特権ユーザーとしてpythonデーモンを実行し、グループメンバシップを維持する

私の問題は、rootよりもむしろ非特権ユーザー(例:mydaemon)としてデーモンを実行したいということです。

デーモンが必要なグループにそのユーザーを追加したデバイスにアクセスできるようにするためです。私はdaemon.DaemonContext(uid=uidofmydamon)を使用しているPythonコードの です。

プロセスがうまくroot daemonizesによって開始され、正しいユーザーが所有しているが、私は、デバイスにアクセスしようとすると許可が deniedエラーが発生しました。 小さなテストアプリケーションを作成しましたが、プロセスがユーザーのグループメンバーシップを継承していないようです。

#!/usr/bin/python 
import logging, daemon, os 

if __name__ == '__main__': 
    lh=logging.StreamHandler() 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    logger.addHandler(lh) 

    uid=1001 ## UID of the daemon user 
    with daemon.DaemonContext(uid=uid, 
          files_preserve=[lh.stream], 
          stderr=lh.stream): 
    logger.warn("UID : %s" % str(os.getuid())) 
    logger.warn("groups: %s" % str(os.getgroups())) 

私はUID = 1001でユーザーとして上記のコードを実行したときに、私はルート(またはsu)のように上記のコードを実行したときには

$ ./testdaemon.py 
UID: 1001 
groups: [29,107,1001] 

のようなものを取得し、私が取得:

​​

はどのようにして、ルートではなく、異なる実効uid そのままグループのメンバーシップを開始したデーモン・プロセスを作成することができますか?

+0

どのようなLinuxディストリビューションですか? – rkyser

+0

ubuntuとdebian(私はそれに応じて質問を更新しました) –

+0

pythonデーモンを起動する前にデーモンユーザに変更できない理由はありますか?おそらく(この回答)[http://stackoverflow.com/a/8941040/651848]のようなものがあなたのニーズに対応できるでしょうか? – rkyser

答えて

2

私の現在のソリューションはstart-stop-daemonためchuid引数を使用して、実際のデーモンを起動する前に、ルートpriviligesを落とす含まれます

start-stop-daemon \ 
     --start \ 
     --chuid daemonuser \ 
     --name testdaemon \ 
     --pidfile /var/run/testdaemon/test.pid \ 
     --startas /tmp/testdaemon.py \ 
    -- \ 
     --pidfile /var/run/testdaemon/test.pid \ 
     --logfile=/var/log/testdaemon/testdaemon.log 

この解決策の欠点は、私はどこデーモンはべき、すべてのディレクトリを作成する必要があること、です実際のデーモン(適切なファイルのアクセス権を持つ)を開始する前に、と/var/log/testdaemon)、の前に書き換えます()。

私はそのロジックをbashではなくpythonで書くことを好みました。

これは今のところ働いていますが、私はこれがよりエレガントな方法で解決できるはずだと考えています。

関連する問題