Linux系统之capsh命令详解

capsh 是 Linux 系统中用于管理和调试进程能力(capability)的工具。能力是 Linux 内核提供的一种细粒度权限控制机制,允许进程在不使用 root 权限的情况下执行特定操作。capsh 提供了一种便捷的方式来设置、修改和验证进程的能力状态,适用于容器化环境、安全测试等场景。

基本语法

capsh [OPTION]...
  • OPTION:可选参数,用于设置能力状态、用户身份、调试信息等。多个选项可以组合使用,按顺序生效。

常用选项

选项 说明
--print 显示当前进程的能力状态及相关信息。
-- [args] 使用 /bin/bash 执行后续参数。例如:capsh -- -c 'echo Hello'
--caps=cap-set 设置当前进程的能力集。cap-set 是能力状态的文本表示。
--drop=cap-list 从当前能力边界集中移除指定的能力。例如:--drop=cap_net_raw
--inh=cap-list 设置当前进程的可继承能力集。
--user=username 以指定用户的身份运行命令。
--uid=id 强制设置当前进程的 UID。
--gid=id 强制设置当前进程的 GID。
--groups=id-list 设置当前进程的补充组。
`–keep=<0 1>`
--decode=N 解码能力向量。例如:--decode=0x0100 显示缺失的能力。
--supports=xxx 验证系统是否支持某个能力。例如:--supports=cap_syslog
--chroot=path 使用 chroot 将根目录更改为指定路径。需要 CAP_SYS_CHROOT 能力。

示例

示例 1:显示当前能力状态
capsh --print

输出示例

Current: = cap_net_bind_service,cap_sys_chroot+i
Bounding set =cap_net_bind_service,cap_sys_chroot

说明:显示当前进程的能力状态,包括有效集、可继承集和边界集。

示例 2:移除特定能力
capsh --drop=cap_net_raw --print

输出示例

Current: = cap_net_bind_service,cap_sys_chroot+i
Bounding set =cap_net_bind_service,cap_sys_chroot

说明:从当前能力边界集中移除 cap_net_raw 能力,并显示更新后的状态。

示例 3:以指定用户身份运行命令
capsh --user=testuser -- -c 'whoami'

输出示例

testuser

说明:以 testuser 用户身份运行 whoami 命令,显示当前用户。

示例 4:解码能力向量
capsh --decode=0x0100

输出示例

0x0100=cap_setpcap

说明:解码能力向量 0x0100,显示其对应的能力名称。

示例 5:验证系统是否支持某个能力
capsh --supports=cap_syslog

说明:如果系统支持 cap_syslog,命令会静默退出;否则返回状态码 1

示例 6:设置能力集并运行命令
capsh --caps="cap_net_bind_service=ep" -- -c 'ping -c 1 127.0.0.1'

说明:设置能力集为 cap_net_bind_service 并运行 ping 命令。

示例 7:使用 chroot 切换根目录
capsh --chroot=/new/root -- -c 'ls /'

说明:将根目录切换为 /new/root 并列出根目录内容。

示例 8:设置可继承能力集
capsh --inh=cap_net_admin --print

输出示例

Current: = cap_net_admin+i
Bounding set =cap_net_admin

说明:设置当前进程的可继承能力集为 cap_net_admin,并显示更新后的状态。

示例 9:强制设置 UID 和 GID
capsh --uid=1000 --gid=1000 -- -c 'id'

输出示例

uid=1000(testuser) gid=1000(testuser) groups=1000(testuser)

说明:将当前进程的 UID 和 GID 强制设置为 1000,并运行 id 命令显示用户信息。

示例 10:设置补充组
capsh --groups=1001,1002 -- -c 'id'

输出示例

uid=1000(testuser) gid=1000(testuser) groups=1000(testuser),1001,1002

说明:将当前进程的补充组设置为 10011002,并运行 id 命令显示组信息。

示例 11:启用 keep-caps 功能
capsh --keep=1 --uid=1000 -- -c 'capsh --print'

说明:启用 keep-caps 功能,允许进程在 setuid 后保留能力,并显示更新后的能力状态。

示例 12:测试 exec() 行为
capsh == --print

说明:再次执行 capsh 并显示能力状态,用于测试 exec() 行为。

示例 13:验证 CAP_SYS_CHROOT 能力
capsh --supports=cap_sys_chroot

说明:验证系统是否支持 CAP_SYS_CHROOT 能力。

示例 14:结合多个选项使用
capsh --uid=1000 --gid=1000 --caps="cap_net_bind_service=ep" -- -c 'ping -c 1 127.0.0.1'

说明:以 UID 1000 和 GID 1000 的身份运行 ping 命令,并设置能力集为 cap_net_bind_service

示例 15:调试能力状态
capsh --drop=cap_net_raw --caps="cap_net_bind_service=ep" --print

说明:移除 cap_net_raw 能力,设置能力集为 cap_net_bind_service,并显示调试信息。

你可能感兴趣的:(linux,运维,服务器,capsh)