温馨提示×

Linux C++怎么配置权限

小樊
39
2026-08-27 07:08:58
栏目: 编程语言

在 Linux 下做 C++ 权限配置,常见场景有 文件/目录权限进程/用户权限可执行文件权限capabilitiesSELinux/AppArmor 等。下面按“最常见 → 进阶”给你一个实用速查表。


一、文件和目录权限(最基础)

1️⃣ 查看权限

ls -l test.cpp

示例:

-rw-r--r-- 1 user user 1234 test.cpp

含义:

  • r
  • w
  • x 执行
  • rwx rwx rwx
    • 所有者 / 所属组 / 其他人

2️⃣ 修改权限(chmod)

数字方式(推荐)

chmod 755 a.out
数字 含义
7 rwx
6 rw-
5 r-x
4 r–

常用组合:

chmod 644 file.cpp   # 普通文件
chmod 755 program    # 可执行程序
chmod 700 dir/      # 私有目录

符号方式

chmod u+x program
chmod o-r file

3️⃣ 修改所有者和组(chown)

sudo chown user:user file

递归修改目录:

sudo chown -R user:user dir/

二、可执行程序权限(C++ 编译后)

1️⃣ 编译后别忘了加执行权限

g++ main.cpp -o app
chmod +x app
./app

2️⃣ 设置 SUID / SGID(谨慎使用)

⚠️ SUID 有安全风险,只在必要时使用

SUID(以所有者身份运行)

sudo chown root:root app
sudo chmod u+s app

示例:

-rwsr-xr-x root root app

SGID(以组身份运行)

sudo chmod g+s dir/

三、进程权限(C++ 程序内部)

1️⃣ 判断当前用户

#include <unistd.h>
#include <sys/types.h>
#include <iostream>

int main() {
    std::cout << "UID: " << getuid() << std::endl;
    std::cout << "EUID: " << geteuid() << std::endl;
}
  • getuid():真实用户
  • geteuid():有效用户(SUID 后不同)

2️⃣ 降权(推荐做法)

setuid(1000);   // 切换到普通用户

或:

seteuid(getuid());

四、Linux Capabilities(推荐替代 SUID)

1️⃣ 给程序单独授权

sudo setcap cap_net_raw+ep ./app

常用 capability:

能力 用途
cap_net_raw 原始 socket
cap_net_admin 网络管理
cap_sys_admin 系统管理(慎用)

查看:

getcap ./app

清除:

sudo setcap -r ./app

比 SUID 更安全


五、文件读写权限(程序内部)

1️⃣ 检查是否有权限

#include <unistd.h>

if (access("file.txt", R_OK) == 0) {
    // 可读
}

2️⃣ 创建文件时指定权限

#include <sys/stat.h>
#include <fcntl.h>

open("file.txt", O_CREAT|O_WRONLY, 0644);

六、SELinux / AppArmor(高级)

SELinux

ls -Z app
chcon -t bin_t app

AppArmor

sudo aa-status

⚠️ 配置复杂,一般服务器安全加固时才用


七、常见实战场景推荐配置

场景 推荐
普通 C++ 程序 chmod 755
需要 root 权限 capabilities
守护进程 启动后 setuid 降权
服务写日志 目录 chown + chmod 750

八、你可以直接问我

如果你愿意,可以告诉我:

  • ✅ 是 普通程序 / 守护进程 / 网络程序 / 驱动?
  • ✅ 需要 root 权限 / 普通用户运行?
  • ✅ 是在 Ubuntu / CentOS / 嵌入式 Linux?

我可以直接给你最合适的一套权限配置方案

0