大家好,我想从 c 创建 tar.gz 文件 程序
我尝试了 system("tar -zcvf file.tar.gz file")
但它没有用。你有没有更好的选择。这是我的代码
int make_tar() {
char buff[100];
DIR *d;
struct dirent *dir;
d = opendir(".");
if (d) {
while ((dir = readdir(d)) != NULL) {
if (dir->d_type == DT_REG) {
sprintf(buff,"%s",dir->d_name);
system("tar -zxvf buff.tar.xz buff");
}
}
closedir(d);
return(0);
}
最佳答案
替换
sprintf(buff,"%s",dir->d_name);
system("tar -zxvf buff.tar.xz buff");
与
if (snprintf(buff, sizeof(buff), "tar -czvf %s.tar.gz %s",
dir->name, dir->name) /// possible code injection!
>= sizeof(buff))
exit(EXIT_FAILURE);
fflush(NULL);
int err = system(buff);
if (err) {
fprintf(stderr, "command failed: %s (%d)\n", buff, err);
exit(EXIT_FAILURE);
}
else printf ("did %s\n", buff);
可能会有帮助。你应该使用 snprintf(3) (避免 sprintf
!!)以避免 buffer overflow ,并且您需要在命令中输入文件的实际名称(不是 buff
)。
您最好声明 buff
以包含更多字符,例如char buff[512];
甚至 static char buff[2*PATH_MAX+25];
(可能超过 8 KB)或 char buff[2 *NAME_MAX+30];
或使用 asprintf(3)
另请阅读 code injection ,这会让你害怕你的代码。想象一下您的程序的恶意用户有一个名为 foo 的文件; rm -rf ..
(因为文件名可以包含空格、分号、破折号和点)..
你应该考虑using libtar
...
您应该阅读更多关于 tar(1) 的内容并且可能还考虑将 -T
即 --files-from=
FILE 选项传递给它(并让您的程序构造一个临时文本文件列出要备份的每个文件,每行一个;这对于其中包含换行符的文件名不利。
关于使用 C 创建一个 tar.gz 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32657235/