gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:06:43 26 4
gpt4 key购买 nike

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

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

由于U盘没有挂载在服务器文件系统中,我无法使用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% 的情况下,这不会影响脚本的执行,但偶尔会导致脚本无法扫描目录。

最佳答案

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

在我的机器上试过,它似乎可以工作:

<?php

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

我将引号内的变量分开,然后用“.”加回去

-肯

关于PHP:shell_exec ("mkdir") 和 shell_exec("rm -rf) 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com