2013-07-01 10 views
6

Sto scrivendo un demone in python, usando il pacchetto python-daemon. il demone viene avviato all'avvio (init.d) e deve accedere a vari dispositivi. il demone deve essere eseguito su un sistema incorporato (beaglebone) con ubuntu in esecuzione.eseguendo python-daemon come utente non privilegiato e mantenendo l'appartenenza al gruppo

ora il mio problema è che voglio eseguire il daemon come utente non privilegiato piuttosto (ad esempio mydaemon) rispetto a root.

per consentire al demone di accedere ai dispositivi ho aggiunto quell'utente ai gruppi richiesti. nel codice python uso daemon.DaemonContext(uid=uidofmydamon).

il processo avviato dal root daemonizes piacevolmente ed è di proprietà l'utente corretto, ma ho permesso negato errori quando si cerca di accedere ai dispositivi. Ho scritto una piccola applicazione di test e sembra che il processo non erediti le appartenenze ai gruppi dell'utente.

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

quando ho eseguito il codice di cui sopra come l'utente con uid = 1001 ottengo qualcosa come

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

mentre quando faccio funzionare il codice di cui sopra come root (o su), ottengo:

Come posso creare un processo daemon avviato da root ma con un diverso uid effettivo e appartenenze di gruppo intatte?

+0

Per che distro Linux è questo? – rkyser

+0

ubuntu e debian (ho aggiornato la domanda di conseguenza) –

+0

C'è un motivo per cui non è possibile modificare l'utente del daemon prima di avviare il daemon python? Forse qualcosa di simile (questa risposta) [http://stackoverflow.com/a/8941040/651848] potrebbe funzionare per le tue esigenze? – rkyser

risposta

2

la mia soluzione attuale prevede cadere privilegi di root prima di avviare il demone reale, utilizzando l'argomento chuid per start-stop-daemon:

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 

l'inconveniente di questa soluzione è che ho bisogno di creare tutte le directory, in cui il demone dovrebbe scrivere su (notoriamente /var/run/testdaemon e /var/log/testdaemon), prima del avviando il demone effettivo (con le autorizzazioni file corrette).

avrei preferito scrivere quella logica in python piuttosto che bash.

per ora funziona, ma io penso che questo dovrebbe essere risolvibile in un modo più elegante.