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

如何让普通用户所属的C程序写入root拥有的文件?

普通用户程序写入root拥有文件的解决方案

问题场景说明

你当前的测试代码存在两个问题:一是普通用户无权限写入root所属文件,二是fclose(fp)未判断fp是否为NULL,导致空指针访问触发段错误。当前环境:

  • 可执行程序test:属主user,权限rwxrwxr-x
  • 目标文件textfile.txt:属主root,权限rw-rw-r--
  • 运行程序时提示无法打开文件,随后触发段错误

可行解决方案

1. 访问控制列表(ACL)推荐

这是最安全的方案,仅给指定普通用户赋予目标文件的写入权限,无需提升程序权限:

  • 执行命令(替换user为你的普通用户名):
    sudo setfacl -m u:user:rw textfile.txt
    
  • 验证权限:
    getfacl textfile.txt
    
  • 此时你的普通用户程序无需任何特殊处理,修正段错误后即可正常写入:
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        printf("测试写入root拥有的文件\n");
    
        FILE *fp = fopen("textfile.txt", "a"); // 用追加模式避免覆盖,按需调整
    
        if (fp != NULL) {
            fprintf(fp, "写入成功!\n");
            printf("内容已成功写入文件\n");
            fclose(fp);
        } else {
            printf("无法打开文件\n");
        }
    
        return 0;
    }
    

2. 设置SUID位(谨慎使用)

通过给程序设置SUID位,让普通用户运行时临时获得root权限。注意:此方法存在安全风险,必须确保程序无漏洞,避免被恶意利用:

  • 编译程序后,执行以下命令(需root权限):
    sudo chown root:root test
    sudo chmod u+s test
    
  • 优化后的安全版C代码:打开文件后立即降回普通用户权限,减少权限暴露窗口
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int main(int argc, char **argv)
    {
        printf("测试写入root拥有的文件\n");
    
        uid_t real_uid = getuid();       // 普通用户的真实UID
        uid_t effective_uid = geteuid(); // SUID带来的有效UID(root)
        FILE *fp = NULL;
    
        // 临时提升权限打开文件
        if (seteuid(effective_uid) == 0) {
            fp = fopen("textfile.txt", "a");
            // 立即降回普通用户权限
            seteuid(real_uid);
        }
    
        if (fp != NULL) {
            fprintf(fp, "写入成功!\n");
            printf("内容已成功写入文件\n");
            fclose(fp);
        } else {
            printf("无法打开文件\n");
        }
    
        return 0;
    }
    

3. 全局权限调整(不推荐)

直接给目标文件添加其他用户的写入权限,此方法会让所有用户都能修改文件,安全性极低,禁止用于系统文件(如/etc目录下的文件):

sudo chmod o+w textfile.txt

其他语言参考(以Python为例)

  • 优先使用ACL方案,脚本无需特殊处理:
    try:
        with open("textfile.txt", "a") as f:
            f.write("写入成功!\n")
        print("内容已成功写入文件")
    except Exception as e:
        print(f"无法打开文件: {e}")
    
  • 若需SUID方式,由于Python脚本无法直接设置SUID,可通过C语言包装器实现,或使用setcap赋予特定权限(风险较高,不推荐):
    sudo setcap cap_dac_override+ep /usr/bin/python3
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:47:09