如何让普通用户所属的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
相关产品推荐
相关产品推荐

