粹脍誊 发表于 2025-6-1 21:07:28

Linux 下 C++ 设置子进程 capability、切换用户、execl调用

目录

[*]设定时间的程序
[*]子进程切换用户后设置时间
[*]execl 调用
[*]找不到动态库

[*]方法 1:使用 rpath 硬编码库路径
[*]方法 2:将库路径加入系统配置
[*]方法 3:将库文件复制到标准目录

[*]最终解决方案 Ambient

折腾半天,又是问deepseek又是问朋友,终于解决了。
Linux 有一个能力(capability)机制,相当于是对root权限的细分,你可以把这些权限细分给进程或程序。能力的介绍可以看看这个博客,我就不多说了。
出于安全考虑,我需要给子进程设置能力,同时又要切换到普通用户,再用execl执行别的程序。结果搞半天都没搞定。
关键的地方在于,execl调用可执行文件后的能力,既取决于进程本身,也取决于可执行文件的能力设置。我进行了一些测试,终于是搞定了。以下是一个调用子进程后通过execl执行设定系统时间的程序的例子。设定系统时间需要root权限,或者 CAP_SYS_TIME能力。测试的操作系统为 CentOS 7.6
设定时间的程序

首先,我们执行timedatectl set-ntp false关闭系统自动校时。
然后,写一个设定时间、打印时间然后睡觉的C++程序。
#include #include #include #include // Function to set the system timevoid SetSystemTime(const struct tm& newTime) {    struct timeval tv;    tv.tv_sec = mktime(const_cast(&newTime));// Convert struct tm to time_t    tv.tv_usec = 0;    if (settimeofday(&tv, nullptr) != 0) {      perror("Failed to set system time");    } else {      std::cout
页: [1]
查看完整版本: Linux 下 C++ 设置子进程 capability、切换用户、execl调用