2013-07-01 6 views
6

python-daemon 패키지를 사용하여 파이썬으로 데몬을 작성하고 있습니다. 데몬은 부팅시 시작되고 (init.d) 다양한 장치에 액세스해야합니다. 데몬은 우분투를 실행하는 임베디드 시스템 (beaglebone)에서 실행해야합니다.비공개 사용자로 python-daemon을 실행하고 그룹 멤버쉽을 유지

내 문제는 root이 아닌 권한이없는 사용자 (예 : mydaemon)로 데몬을 실행하고 싶습니다.

데몬이 해당 사용자를 필요한 그룹에 추가 한 장치에 액세스 할 수 있도록 허용합니다. 은 파이썬 코드에서 daemon.DaemonContext(uid=uidofmydamon)을 사용합니다.

root에 의해 프로세스가 시작되고 올바른 사용자가 소유하고 있지만, 권한이 거부되었습니다. 장치에 액세스하려고하면 오류가 발생합니다. 작은 테스트 응용 프로그램을 작성했으며 프로세스가 사용자의 그룹 구성원 자격을 상속하지 않는 것으로 보입니다. 내가 UID를 가진 사용자로 위의 코드를 실행하면

#!/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())) 

= 1001 내가 루트 (또는 su)로 위의 코드를 실행하면 반면

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

같은, 내가 얻을 수 :

$ sudo ./testdaemon.py 
UID: 1001 
groups: [0] 

루트로 시작하지만 다른 유효 uid가 인 그룹 회원 자격으로 시작하는 데몬 프로세스를 만들려면 어떻게해야합니까?

+0

어떤 리눅스 배포판입니까? – rkyser

+0

우분투와 데비안 (내가 그에 따라 업데이트 됨) –

+0

파이썬 데몬을 시작하기 전에 데몬 사용자로 변경할 수없는 이유가 있습니까? 아마도 (이 답변) [http://stackoverflow.com/a/8941040/651848]과 같은 것이 귀하의 필요에 부합 할 수 있습니까? – rkyser

답변

2

내 현재의 솔루션은 start-stop-daemonchuid 인수를 사용하여, 실제 데몬을 시작하기 전에 루트 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으로 작성해야한다.

지금은 작동하지만, 더 우아한 방식으로 해결할 수 있어야한다고 생각합니다.