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]