温馨提示×

linux进程权限如何改

小樊
45
2026-09-03 11:29:58
栏目: 智能运维

在 Linux 中,“进程权限”通常指进程以哪个用户/组身份运行,以及具备哪些 capability(能力)。下面按常见场景系统说明。


一、启动进程时指定用户(最常见)

1. 用 su / sudo 切换用户运行

sudo -u www-data ./myapp

su www-data -c "/path/to/app"

2. systemd 服务指定用户

[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


三、使用文件 SUID / SGID(提权运行)

让程序以文件所有者身份运行

chown root:root myapp
chmod 4755 myapp

运行 myapp 时,进程 UID = root

⚠️ 安全风险极高,不建议随便用


四、使用 Capabilities(精细权限)

不给 root,只给部分权限(推荐)

查看进程 capability

cat /proc/<pid>/status | grep Cap

给可执行文件加 capability

setcap cap_net_bind_service=+ep /path/to/app

这样非 root 也能绑定 80 端口

常用 capability

  • cap_net_bind_service:绑低位端口
  • cap_sys_admin:挂载、namespace
  • cap_dac_override:绕过文件权限

五、以 root 降权运行(标准做法)

很多服务启动流程:

  1. 以 root 启动
  2. 做特权操作(绑端口)
  3. 调用 setuid() 降权

示例(C):

setuid(1000);

六、查看进程当前权限

ps -o pid,user,cmd -p <pid>
id <pid>   # 不一定可用

查看 capability:

getpcaps <pid>

七、容器场景(Docker)

docker run -u 1000:1000 myimage

docker run --cap-add NET_ADMIN myimage

总结速查表

需求 方法
以某用户运行 sudo -u / systemd User
改运行中进程 不支持(只能代码 setuid)
提权运行 SUID / Capabilities
精细权限 setcap
容器 -u / --cap-add

如果你能说明:

  • 运行前 还是 运行中
  • 用户权限 还是 系统能力
  • 使用场景(服务 / 脚本 / 容器)

我可以给你更精确的操作命令。

0