gpt4 book ai didi

python - 以非特权用户身份运行 python-daemon 并保持组成员身份

转载 作者:IT王子 更新时间:2023-10-29 00:58:00 26 4
gpt4 key购买 nike

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

现在我的问题是我想以非特权用户(例如 mydaemon)而不是 root 身份运行守护程序。

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

root 启动的进程很好地守护进程并由正确的用户拥有,但我在尝试访问设备时遇到permission 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 的用户身份运行上面的代码时,我得到类似的东西

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

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

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

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

最佳答案

我目前的解决方案是在启动实际守护进程之前放弃 root 权限,使用 start-stop-daemonchuid 参数:

 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/run/testdaemon/var/log/testdaemon ), 启动实际守护进程(具有适当的文件权限)之前。

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

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

关于python - 以非特权用户身份运行 python-daemon 并保持组成员身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17404140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com