You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:16:09