2013-06-25 143 views
3

的奇怪问题我正在研究一个PHP脚本来自动解压缩和扫描位于外部USB驱动器上的tar.gz存档,而且我遇到一些奇怪的问题,一旦脚本找到一个档案,它会尝试在USB驱动器上创建一个临时目录来解压档案,为了保证唯一的临时目录名称(因为这个脚本可能同时运行多次)我使用当前时间的MD5的随机5位部分为文件命名,例如:PHP:shell_exec(“mkdir”)和shell_exec(“rm -rf)

$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应该重写此错误。此行为也可以在服务器的命令提示符中重复。

我似乎无法找到与这些问题之一在网上任何东西,所以我希望这只是我做出愚蠢的错误,而不是与我的安装或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%的时间,这不影响脚本的执行,但偶尔它会导致脚本无法扫描目录。

回答

0

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

0

对于#1,看起来像是一些奇怪的角色进入那里。

想这在我的机器上,并且它似乎工作:

<?php 

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

我从引号内分离变量并添加回用“”

-Ken

+0

这个问题是我需要能够将临时目录的名称保存到一个变量(我可以使用终端命令找到它,但似乎不必要地迂回)。我尝试过这样:'shell_exec(“mkdir”。$ temp);'但它似乎没有什么区别。 – NinjaBlob

+0

你可以直接回显$ temp变量吗?我的猜测是一些非ASCII字符正在进入。 –

+0

我试过了,但我仍然遇到同样的问题: 'ob_start(); echo $ temp; $ temp = ob_get_clean();' – NinjaBlob

相关问题