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

已知root密码,如何在Linux环境下C程序中以root身份执行指定函数?

Linux 普通C程序通过已知root密码执行高权限操作实现方案

核心思路

由于你的程序无法设置setuid权限,也没有预配置的sudo提权规则,无法直接在当前进程内提升权限,因此唯一可行方案是:

  • 拆分高权限逻辑为可独立执行的单元
  • 在主程序内创建子进程调用sudo命令,通过管道将已获取的root密码传递给sudo完成提权,间接执行高权限逻辑

具体实现步骤

1. 拆分高权限逻辑

将int read_magic_file(int x)的逻辑单独封装为独立可执行文件,例如命名为read_magic,接收整数x作为命令行参数,执行完成后将原函数返回值作为进程退出码返回。

2. 主程序调用sudo完成提权执行

利用sudo的-S参数(指定从标准输入读取密码),通过父子进程管道传递密码,示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

int main() {
    // 示例:已提前获取的root密码、已确定的参数x
    const char* input_root_pass = "用户输入的root密码";
    int x = 1024; // 你已确定的参数x的值

    int pipe_fd[2];
    if (pipe(pipe_fd) != 0) {
        perror("创建管道失败");
        return EXIT_FAILURE;
    }

    pid_t child_pid = fork();
    if (child_pid < 0) {
        perror("创建子进程失败");
        return EXIT_FAILURE;
    } else if (child_pid == 0) {
        // 子进程:执行sudo提权命令
        close(pipe_fd[1]); // 关闭管道写端
        // 将标准输入绑定到管道读端,让sudo从管道读取密码
        dup2(pipe_fd[0], STDIN_FILENO);
        close(pipe_fd[0]);

        // 构造sudo执行参数
        char x_str[16];
        snprintf(x_str, sizeof(x_str), "%d", x);
        // 注意路径要根据你的read_magic可执行文件位置调整
        execlp("sudo", "sudo", "-S", "./read_magic", x_str, NULL);
        perror("启动sudo失败");
        exit(EXIT_FAILURE);
    } else {
        // 父进程:向管道写入root密码
        close(pipe_fd[0]); // 关闭管道读端
        // 写入密码+换行符,模拟用户输入密码后按回车的操作
        write(pipe_fd[1], input_root_pass, strlen(input_root_pass));
        write(pipe_fd[1], "\n", 1);
        close(pipe_fd[1]);

        // 等待子进程执行完成,获取返回值
        int wait_status;
        waitpid(child_pid, &wait_status, 0);
        int func_ret = WEXITSTATUS(wait_status);
        printf("read_magic_file执行结果:%d\n", func_ret);
    }

    return EXIT_SUCCESS;
}

注意事项

  • 如果read_magic_file逻辑简单,不需要单独拆分可执行文件,也可以直接通过sudo sh -c "高权限命令"的方式执行,减少拆分工作量
  • 进程退出码的取值范围为0~255,如果你的read_magic_file返回值超出该范围,可以让子进程将结果打印到标准输出,父进程额外创建管道读取子进程的标准输出即可获取完整返回值
  • 密码全程在内存管道中传递,不会写入磁盘,避免密码泄露风险

内容的提问来源于stack exchange,提问作者einpoklum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:54:07