将python-daemon作为非特权用户运行并保留组成员身份

uml*_*ute 6 python linux ubuntu python-daemon

我正在使用python-daemon包在python中编写一个守护进程.守护进程在启动时(init.d)启动,需要访问各种设备.守护进程是在运行ubuntu 的嵌入式系统(beaglebone)上运行的.

现在我的问题是我想将守护进程作为非特权用户运行而不是(例如mydaemon)root.

为了允许守护进程访问设备,我将该用户添加到所需的组中.在我使用的python代码中daemon.DaemonContext(uid=uidofmydamon).

该过程由rootdaemonizes很好地启动,并由正确的用户拥有,但在尝试访问设备时,我获得了权限被拒绝的错误.我写了一个小的测试应用程序,似乎该进程没有继承用户的组成员身份.

#!/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()))
Run Code Online (Sandbox Code Playgroud)

当我以uid = 1001的用户运行上面的代码时,我得到类似的东西

$ ./testdaemon.py
UID: 1001
groups: [29,107,1001]
Run Code Online (Sandbox Code Playgroud)

而当我以root(或su)运行上面的代码时,我得到:

$ sudo ./testdaemon.py
UID: 1001
groups: [0]
Run Code Online (Sandbox Code Playgroud)

如何创建由root启动的守护程序进程,但具有不同的有效uid 完整的组成员身份?

uml*_*ute 2

我当前的解决方案涉及在启动实际守护进程之前删除 root 权限,使用以下chuid参数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
Run Code Online (Sandbox Code Playgroud)

该解决方案的缺点是,我需要在启动实际守护进程(具有适当的文件权限)之前创建守护进程应该写入的所有目录(特别是/var/run/testdaemon/var/log/testdaemon) 。

我更愿意用 python 而不是 bash 来编写该逻辑。

目前,这是可行的,但我认为这应该可以以更优雅的方式解决。