在 Linux 中,“进程权限”通常指进程以哪个用户/组身份运行,以及具备哪些 capability(能力)。下面按常见场景系统说明。
su / sudo 切换用户运行sudo -u www-data ./myapp
或
su www-data -c "/path/to/app"
[Service]
User=www-data
Group=www-data
ExecStart=/path/to/app
然后:
systemctl daemon-reload
systemctl restart myapp
Linux 不允许直接改已经运行的进程的 UID(除非进程自己调用 setuid())。
只能在进程内部通过代码改:
setuid(1000); // 改成 uid=1000
setgid(1000);
或 Python:
os.setuid(1000)
⚠️ 只有 root 或具备
CAP_SETUID的进程才能改 UID
让程序以文件所有者身份运行:
chown root:root myapp
chmod 4755 myapp
运行 myapp 时,进程 UID = root
⚠️ 安全风险极高,不建议随便用
不给 root,只给部分权限(推荐)
cat /proc/<pid>/status | grep Cap
setcap cap_net_bind_service=+ep /path/to/app
这样非 root 也能绑定 80 端口
cap_net_bind_service:绑低位端口cap_sys_admin:挂载、namespacecap_dac_override:绕过文件权限很多服务启动流程:
setuid() 降权示例(C):
setuid(1000);
ps -o pid,user,cmd -p <pid>
id <pid> # 不一定可用
查看 capability:
getpcaps <pid>
docker run -u 1000:1000 myimage
或
docker run --cap-add NET_ADMIN myimage
| 需求 | 方法 |
|---|---|
| 以某用户运行 | sudo -u / systemd User |
| 改运行中进程 | 不支持(只能代码 setuid) |
| 提权运行 | SUID / Capabilities |
| 精细权限 | setcap |
| 容器 | -u / --cap-add |
如果你能说明:
我可以给你更精确的操作命令。