在 Linux 下用 C++ 配置权限,通常分为两大类场景:
1️⃣ 文件/目录权限(chmod、chown)
2️⃣ 进程权限(setuid、capabilities、用户切换)
下面按常见需求系统说明。
chmod(修改权限)#include <sys/stat.h>
int main() {
chmod("test.txt", 0644); // rw-r--r--
return 0;
}
权限含义:
0644
0 文件类型占位
6 owner: rw
4 group: r
4 other: r
常用权限:
| 权限 | 含义 |
|---|---|
| 0644 | 普通文件 |
| 0755 | 可执行文件 / 目录 |
| 0700 | 仅 owner 可访问 |
chown(修改所有者)#include <unistd.h>
int main() {
chown("test.txt", 1000, 1000); // uid, gid
return 0;
}
⚠️ 只有 root 才能成功
umask(设置默认权限)#include <sys/stat.h>
int main() {
umask(0022); // 新建文件默认 755 / 644
return 0;
}
gcc test.cpp -o test
sudo chown root:root test
sudo chmod u+s test
#include <iostream>
#include <unistd.h>
int main() {
std::cout << "UID: " << getuid() << std::endl;
return 0;
}
⚠️ setuid 程序必须非常小心(安全风险)
sudo setcap cap_net_raw+ep ./program
常见 capability:
| 能力 | 用途 |
|---|---|
| CAP_NET_RAW | 原始 socket |
| CAP_SYS_ADMIN | 系统管理 |
| CAP_DAC_OVERRIDE | 绕过文件权限 |
#include <unistd.h>
getuid(); // 实际用户
geteuid(); // 有效用户
seteuid(0); // 成为 root(需权限)
#include <sys/stat.h>
mkdir("mydir", 0755);
❌ Permission denied
x❌ setuid 无效
nosuid| 需求 | 推荐方式 |
|---|---|
| 修改文件权限 | chmod |
| 修改文件所有者 | chown |
| 需要 root 能力 | capabilities |
| 程序以 root 运行 | setuid(谨慎) |
| 新建文件默认权限 | umask |
如果你能具体说明:
✅ 是文件权限?进程权限?服务权限?
✅ 普通用户 / root / systemd 服务?
我可以给你更精确的配置示例。