折腾半天,又是问deepseek又是问朋侪,终于办理了。
Linux 有一个本领(capability)机制,相当于是对root权限的细分,你可以把这些权限细分给历程或程序。本领的介绍可以看看这个博客,我就不多说了。
出于安全思量,我需要给子历程设置本领,同时又要切换到普通用户,再用execl执行别的程序。效果搞半天都没搞定。
关键的地方在于,execl调用可执行文件后的本领,既取决于历程自己,也取决于可执行文件的本领设置。我进行了一些测试,终于是搞定了。以下是一个调用子历程后通过execl执行设定系统时间的程序的例子。设定系统时间需要root权限,大概 CAP_SYS_TIME本领。测试的操作系统为 CentOS 7.6
设定时间的程序
首先,我们执行timedatectl set-ntp false关闭系统自动校时。
然后,写一个设定时间、打印时间然后睡觉的C++程序。
[code]#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 |