systemd服务降权需在[service]节设user=和group=,确保用户存在、路径权限适配、端口绑定用setcap授权,重载后验证uid与状态,系统服务与--user用户服务不可混用。

直接在服务单元文件的 [Service] 小节中设置 User= 和 Group= 即可,这是 systemd 原生支持的降权机制,无需额外封装或切换用户命令。
修改服务单元文件
编辑对应的服务文件(如 /etc/systemd/system/myapp.service),在 [Service] 段添加:
-
User=myuser:指定运行进程的用户名,该用户必须已存在,且其主目录、shell 等基础属性合法(不强制要求可登录) -
Group=mygroup:可选,用于赋予额外组权限,例如访问/dev/ttyUSB0或共享数据目录 - 删除或注释掉冲突项,如
RootDirectory=、DynamicUser=yes(除非你明确需要动态用户)
确保路径与权限适配
仅设 User= 不足以让服务稳定启动,还需检查:
-
ExecStart所指向的二进制或脚本,目标用户必须有执行权限(chmod +x) - 用
WorkingDirectory=显式指定工作目录,并确认该目录归属目标用户(chown myuser:mygroup /path/to/workdir) - 配置文件、日志路径、PID 文件等,均需对该用户可读写
- 若需绑定 1024 以下端口(如 80/443),用
setcap 'cap_net_bind_service+ep' /path/to/binary授权,避免启用 root
重载并验证身份
完成修改后依次执行:
-
sudo systemctl daemon-reload—— 重新加载 unit 配置 sudo systemctl restart myapp.service- 检查进程实际 UID:
ps -eo pid,user,comm,args | grep myapp,观察USER列是否为预期用户 - 查看服务状态:
systemctl status myapp.service,确认Active:为active (running)且无权限类报错
注意区分系统服务与用户服务
User= 是系统级 service 的字段,用于让一个全局服务以低权限运行;它和 systemctl --user 完全无关。--user 启动的是独立的用户会话实例,配置应放在 ~/.config/systemd/user/ 下,且需提前启用 loginctl enable-linger username。两者不能混用:系统服务不能靠 --user 启动,用户服务也不能塞进 /etc/systemd/system/ 并加 User= 来“模拟”。











