自动 7zip 任务 - “无法打开文件作为存档”

Posted

技术标签:

【中文标题】自动 7zip 任务 - “无法打开文件作为存档”【英文标题】:Automated 7zip task - "can not open file as archve" 【发布时间】:2014-02-06 20:18:34 【问题描述】:

我有一个自动化任务,它侦听从远程机器接收到的 7zip 文件,然后提取存档。每当我从远程机器手动推送文件时,该过程运行良好。但是,在一天中的某个时间,有几十台机器将文件推送到我的服务器,当 7zip 尝试提取它们时,大约 8-9% 的文件返回以下错误:

7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,6 CPUs)

Processing archive: /home/pos/inbox/05730049_20140206.7z

Error: Can not open file as archive

以后进去手动解压的时候,解压存档没有问题:

7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,6 CPUs)

Processing archive: /data/pos/processed/05730013_20140206.7z

Extracting  file01.txt
Extracting  file02.txt
Extracting  file03.txt
Extracting  file04.txt
Extracting  file05.txt
Extracting  file06.txt
Extracting  file07.txt
Extracting  file08.txt
Extracting  file09.txt
Extracting  file10.txt

Everything is Ok

Files: 10
Size:       472129
Compressed: 16506

我很确定存档没有任何问题,因为 (1) 每台远程计算机上的脚本都是相同的,并且仅在 8-9% 的存档中发生,以及 (2) 当我手动提取它时,它不会返回相同的错误。有什么方法可以确保文件自行正确提取?

提取它的php代码是这样的:

function import_unzip($filename) 
  global $debug,$fail_type,$clientID,$location,$mode;

  ...

  if (!is_readable("/home/pos/inbox/$filename")) 
    $fail_type = 'NF';
    return false;
   else     
    //Unzip the file
    $cmd_res = exec("7za e -y -o/data/pos/$clientID$location /home/pos/inbox/$filename -p$zip_passwd[$clientID]",$output,$return_var);
    return $success;
  

我的第一个倾向是在 7z 命令周围放置一个错误处理 while 循环,并尝试三次左右,但我希望有一个更优雅的解决方案。

【问题讨论】:

在这里猜测,文件“尚未准备好”,即它是可读的,但还没有包含所有内容?你的代码看起来也很危险,你可能允许攻击者在命令行中插入内容,$clientID、$location、$filename、$zip_passwd 是从哪里来的? 这些变量都来自php脚本中的其他地方(即全局变量、函数参数)。我已将问题范围缩小到 7zip 进程,因此我没有费心将帖子与脚本的其余部分混为一谈。 我可以建议一个“调试”选项,在运行 7za 之前将文件复制到 /tmp/ 目录,然后运行 ​​7za,至少如果它失败,你知道失败的文件是如何看起来,因为目前,我认为你有一个比赛条件 我会试一试。感谢您的建议。 【参考方案1】:

我看起来你有竞争条件。试试 cmets 中的调试选项。

【讨论】:

以上是关于自动 7zip 任务 - “无法打开文件作为存档”的主要内容,如果未能解决你的问题,请参考以下文章

Mac 像windows一样使用右键压缩,使用p7zip实现

Ubuntu 16.04安装7zip

使用 7zip 命令行实用程序解密加密的 7zip 存档文件

Mac 10.12安装7zip/rar解压/压缩工具7zip-Keka

NMAKE:如何强制调试构建? [7ZIP]

如何在不将批处理文件复制到 c 中的 7zip 文件夹的情况下运行 7zip 批处理