PHP:shell_exec(“mkdir”)和shell_exec(“rm -rf”)的奇怪问题

时间:2013-06-25 17:24:16

标签: php corruption mkdir shell-exec rm

我正在开发一个PHP脚本来自动解压缩和扫描位于外部USB驱动器上的tar.gz存档,我遇到了一些奇怪的问题。一旦脚本找到存档,它就会尝试在USB驱动器上创建一个临时目录以将存档解压缩到。为了保证唯一的临时目录名称(因为此脚本可能同时运行多次),我使用当前时间MD5的随机5位数部分命名文件,如下所示:

$temp = "/media/$driveName/".substr(md5(microtime()), rand(0, 26), 5);

由于USB驱动器没有安装在服务器文件系统中,我不能使用PHP的内置文件管理命令(mkdir(),glob()等),而只能使用终端与文件系统交互用exec()或shell_exec()执行的命令。因此,要实际创建具有上述名称的临时目录,我使用基本终端mkdir命令:

shell_exec("mkdir $temp");

接下来,我将存档解压缩到临时目录:

shell_exec("tar -xzf $archivePath -C $temp");

最后,在我完成对存档的分析之后,我删除了临时目录及其内容:

shell_exec("rm -rf $temp");

但是,我遇到了两个奇怪的问题:

  1. 有时,每五次运行中就有一次运行,临时目录的名称已损坏。使用ls directory显示时,它看起来像06191v??????.???v???。但是,当使用tab键自动填写cd命令时,它会填充更长的字符串,例如06191v\342\226\200\342\225\232.\342\211\2100v\342\226\200/。我知道字符串在传递给shell_exec()之前就已经很好了(我甚至尝试使用substr()将其限制为正确的长度,但无效),以及第一个斜杠后面的一系列字符(所以从342开始)始终是相同的,无论最初的五个字符是什么(初始五个和斜杠之间的字符总是一个字母,但在其他方面是随机的)。除此之外,我不知所措。

  2. 出于某种原因,我用来删除脚本末尾的临时目录的shell_exec("rm -rf $temp");只有在我执行两次时才有效。如果我只执行一次,我会收到以下错误:rm: cannot remove '/media/FILESYSTEM/f3637': Directory not empty,这本身很奇怪,因为-rf应该覆盖此错误。此行为也可以在服务器的命令提示符中重复。

  3. 我似乎无法在网上找到与这些问题相关的任何内容,所以我希望这只是我犯了一个愚蠢的错误而不是我的安装或USB驱动器的问题。在此先感谢您的帮助!

    编辑:我实际上有第三个问题可能与第一个问题有关。运行shell_exec("tar -xzf")命令解压缩归档后,生成的目录始终会附加一些奇怪的字符。例如,对于一个名为BOOT的压缩目录的运行,解压缩的目录在终端中显示为BOOT??w??????.???w???,其回显输出显示为BOOT²w▀╚.∙wâ–€。在使用tab将cd命令填入此目录后,我得到一个具有几乎相同模式的字符串:BOOT\302\262w\342\226\200\342\225\232 2.\342\210\231w\342\226\200/。 99%的情况下,这不会影响脚本的执行,但偶尔会导致脚本无法扫描目录。

2 个答案:

答案 0 :(得分:0)

对于#1,似乎有些奇怪的角色进入那里。

在我的机器上尝试过,它似乎有效:

<?php

for($x = 0; $x < 30 ; $x++)
    shell_exec('mkdir ' . substr(md5(microtime()), rand(0, 26), 5));
    sleep(1);

我将变量与引号内部分开,然后用“。”添加回来。

-Ken

答案 1 :(得分:0)

事实证明,所有三个问题都有相同的解决方案:在USB驱动器之外的某处创建临时存档。我不知道是什么导致了额外的字符,但是当我将临时目录位置移动到Linux的/ tmp目录时,它们一劳永逸地消失了。