[英]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.