自动 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实现
使用 7zip 命令行实用程序解密加密的 7zip 存档文件