繁体   English   中英

使用C创建tar.gz文件

[英]create a tar.gz file using C

大家好,我想从ac程序创建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 !!)来避免缓冲区溢出 ,并且需要在命令中放置文件的实际名称(而不是buff )。

您最好声明buff包含更多字符,例如char buff[512]; 甚至是static char buff[2*PATH_MAX+25]; (可能超过8 KB)或char buff[2*NAME_MAX+30]; 或使用asprintf(3)

另请阅读有关代码注入的信息 ,这会让您感到害怕。 想象一下您的程序的恶意用户有一个名为foo ; rm -rf ..的文件foo ; rm -rf .. foo ; rm -rf .. (因为文件名可以包含空格,分号,破折号和点)。

您应该考虑使用libtar ...

您应该阅读有关tar(1)的更多信息,并且还可以考虑将-T--files-from= FILE选项传递给它(并让您的程序构造一个临时文本文件,列出要备份的每个文件,每行一个;这很成功)不适用于其中包含换行符的文件名)。

更改您的sprintf和系统调用

sprintf(buff,"tar -zcvf buff.tar.xz %s",dir->d_name);
system(buff);

我猜想您要压缩已找到的目录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM