从 C 程序中粉碎并删除 linux 中的文件

shred and remove files in linux from a C program

我想在删除文件之前粉碎一些由我的 C 程序生成的临时文件。

目前我正在使用

system("shred /tmp/datafile");
system("rm /tmp/datafile");

在我的程序中,但我认为调用 system 函数不是最好的方法(如果我错了请纠正我......)还有其他方法吗?如何从我的代码本身中分解文件?图书馆什么的?另外,关于删除部分,this answer好吗?

您可以使用以下代码:

#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>

#define BUF_SIZE 4096
#define ABS_FILE_PATH "/tmp/aaa"

int main()
{
    //get file size
    struct stat stat_buf;
    if (stat(ABS_FILE_PATH, &stat_buf) == -1)
        return errno;
    off_t fsize = stat_buf.st_size;

    //get file for writing
    int fd = open(ABS_FILE_PATH, O_WRONLY);
    if (fd == -1)
        return errno;

    //fill file with 0s
    void *buf = malloc(BUF_SIZE);
    memset(buf, 0, BUF_SIZE);
    ssize_t ret = 0;
    off_t shift = 0;
    while((ret = write(fd, buf,
                       ((fsize - shift >BUF_SIZE)?
                       BUF_SIZE:(fsize - shift)))) > 0)
        shift += ret;
    close(fd);
    free(buf);
    if (ret == -1)
        return errno;

    //remove file
    if (remove(ABS_FILE_PATH) == -1)
        return errno;

    return 0;
}

请问您为什么认为这不是实现此目标的最佳方法?如果确实有必要不可挽回地销毁文件内容,这对我来说似乎是一个很好的解决方案。

这种方式的优点是:

  • 程序已经存在(所以开发速度更快);和
  • 该程序已被信任。

第二点很重要。可能夸大了精心清理文件的必要性(Peter Gutmann 在相关 wikipedia page 上引用的评论中将他的方法的某些用途描述为“巫术”),但这并不重要:在任何安全在上下文中,使用现有工具几乎总是比使用自制工具更可靠。

我对您当前使用 system(3) 的方法提出的唯一批评是,由于它在 PATH 中查找 shred 程序,因此有可能原则上,有人可以用它玩游戏并开始恶作剧。但这很容易处理:使用 fork(2)execve(2) 使用完整路径调用特定的二进制文件。

也就是说,如果这只是一个影响不大的整理工作,那么简单 mmap 文件并快速将零写入其中可能会更直接。