使用C创建tar.gz文件

时间:2015-09-18 16:50:50

标签: c linux

大家好我想从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);
}

2 个答案:

答案 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);

我猜你想要找到找到的目录。