大家好我想从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);
}
答案 0 :(得分:2)
更换
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
)。< / p>
您最好声明buff
包含更多字符,例如char buff[512];
甚至static char buff[2*PATH_MAX+25];
(可能超过8千字节)或char buff[2*NAME_MAX+30];
或使用asprintf(3)
另请阅读code injection,这会让您害怕代码。想象一下,程序的恶意用户有一个名为foo ; rm -rf ..
的文件(因为文件名可以包含空格,分号,短划线和点)。
您应该考虑using libtar
...
您应该阅读有关tar(1)的更多信息,也可以考虑将-T
即--files-from=
FILE 选项传递给它(并让您的程序构建一个临时文本文件列出要备份的每个文件,每行一个;这对于带有换行符的文件名不合适。)
答案 1 :(得分:1)
更改您的sprintf和系统调用
sprintf(buff,"tar -zcvf buff.tar.xz %s",dir->d_name);
system(buff);
我猜你想要找到找到的目录。