capsh 命令详解
更新时间:2026-09-17。「一个命令一个文档」系列,属于安全加密与审计族。容器时代不应一上来就
--privileged/root;细粒度的 capabilities 才是最小权限手段,capsh 用来查看和试验能力集合。
Linux 把传统 root 的全能权限拆成几十个 capability(CAP_NET_RAW、CAP_NET_ADMIN、CAP_SYS_ADMIN…)。进程持有几个集合:Effective(实际生效)、Permitted(可获得)、Inheritable(可继承给 exec)、Bounding(上限)。
一、查看当前能力
capsh --print # 打印当前 shell 的各能力集合(最常用)
capsh --print | grep -i current
# Current: = cap_chown,cap_dac_override,... 或空集(普通用户)
# Bounding set = ... 上限集合
# Securebits / namespaces 信息也会列出容器里直接跑 capsh --print 即可看到这个容器被授予/剥夺了哪些能力(镜像需带 libcap,否则在宿主用 grep Cap /proc/self/status)。
二、构造能力集合做实验
sudo capsh --caps="cap_net_raw+eip" -- # 只保留 NET_RAW 后起 shell
sudo capsh --drop=cap_sys_admin -- -c 'id' # 丢掉 SYS_ADMIN 执行命令
sudo capsh --inh="cap_net_admin" --addamb=cap_net_admin --+eip 表示同时置位 effective/inheritable/permitted。配合 unshare/nsenter 时,很多 namespace/网络操作需要的就是具体 capability(如新建 net ns 需 CAP_SYS_ADMIN)而非全部 root。
三、文件能力:getcap / setcap
能力也可赋给可执行文件,让非 root 程序获得单项特权(替代 setuid root):
getcap /usr/bin/ping # 通常有 cap_net_raw(老版本 ping)
sudo setcap cap_net_bind_service+ep /opt/app/server # 允许绑定 <1024 端口
getcap -r / 2>/dev/null # 递归列出系统上所有文件能力经典案例:非 root 服务要监听 80/443,不必用 root 启动或 setuid,
setcap cap_net_bind_service+ep即可;容器内 ping 失败常是没给CAP_NET_RAW;改网卡/iptables 要CAP_NET_ADMIN;几乎"等于 root"的CAP_SYS_ADMIN应尽量不给。
四、与 /proc 和容器的关系
grep Cap /proc/1234/status
# CapInh CapPrm CapEff CapBnd CapAmb,均为十六进制位图
capsh --decode=00000000a80425fb # 把 CapEff 位图解码成名称列表- K8s 在
securityContext.capabilities.add/drop管理,最小权限常先drop: ["ALL"]再加必需项。 - 文件能力在容器镜像、空文件系统、noexec 挂载上可能不生效;capsh 报错要结合内核与挂载标志排查。
相关命令
隔离/namespace 用 unshare/nsenter,权限模型配合 sudo,进程属性读
/proc/<pid>/status,服务端绑特权端口另可用 sysctl 或反向代理替代 setcap。
总结
capsh --print 查看当前进程的 capabilities 集合、--caps/--drop 构造最小权限环境、--decode 解析 /proc 的 CapEff 位图:它把 root 权限拆成 CAP_NET_ADMIN/CAP_SYS_ADMIN 等单项能力,配合 getcap/setcap 给程序按需授权(如 cap_net_bind_service 绑低端口、CAP_NET_RAW 让容器 ping),是容器"drop ALL 再按需 add"最小权限实践的核对工具,避免图省事直接 privileged。