如何在C/C++中通过execvp()调用systemd-run --user且无需密码
解决C++调用
systemd-run --user时的认证弹窗问题 问题场景
在命令行执行systemd-run --user --pipe echo hello时,能正常输出结果且无需认证,但通过C++的execvp()或execvpe()调用相同逻辑的systemd-run时,会弹出「Authentication is required to start transient unit」的认证窗口。
问题原因
核心问题是你传递给exec系列函数的参数数组格式错误。exec要求参数数组的第一个元素必须是被执行程序的名称(通常与exec第一个参数指定的程序名一致),而你的代码里直接将--user作为参数数组的首元素,这会导致systemd-run无法正确识别当前用户的会话上下文,进而触发强制认证检查。
解决方案
修正参数数组,将程序名"systemd-run"作为参数数组的第一个元素,后续才是真正的命令参数。修改后的代码如下:
#include <unistd.h> int main(int argc, char const* const argv[], char const* const envp[]) { char const* argp[] = { "systemd-run", // 补充程序名称作为参数数组首元素 "--user", "--pipe", "echo", "hello", nullptr, }; // 使用execvpe,保留环境变量 ::execvpe("systemd-run", const_cast<char**>(argp), const_cast<char**>(envp)); // 若不需要自定义环境变量,也可使用execvp // ::execvp("systemd-run", const_cast<char**>(argp)); // exec系列函数执行成功不会返回,走到这里说明执行失败 return 1; }
原理说明
当systemd-run接收到正确的程序名作为第一个参数时,它能正常关联到当前用户的会话进程(比如用户的systemd --user实例),从而确认操作的合法性,无需额外认证。这个方案完全基于systemd默认行为,不需要修改任何系统策略,符合你的需求。
内容的提问来源于stack exchange,提问作者xaxazak
相关产品推荐
相关产品推荐

