从 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
文件并快速将零写入其中可能会更直接。
我想在删除文件之前粉碎一些由我的 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
文件并快速将零写入其中可能会更直接。