shell_exec无法使用动态命令

时间:2012-07-19 05:18:21

标签: php bots shell-exec dynamic-code

<?php 
    ini_set('max_execution_time', 864000);
    $seq = "D:/Ractip/Sequence.txt";
    $mir = "D:/Ractip/mirhominid.txt";
    $shandle = fopen($seq, 'r');
    $sdata = fread($shandle, filesize($seq));
    $mhandle = fopen($mir, 'r');
    $mdata = fread($mhandle, filesize($mir));
    $sexp = explode(">", $sdata);
    $mexp = explode(">", $mdata);
    $i = 1;
    $a = 1;
    $count = count($sexp);

    while($i < $count)
    {
        $name = explode("\n", $mexp[$a]);
        $name = explode(" ", $name[0]);
        $name1 = explode("\n", $sexp[$i]);

        $file2 = "D:\Ractip\mir\\"."$name[1]".".txt";
        $file1 = "D:\Ractip\sequence\\"."name1[0]".".txt";

        if ($i == 1){
            mkdir("D:/Ractip/Interactions/"."$name[1]", 0777);
        }

        $file = "D:/Ractip/Interactions/"."$name[1]"."/"."$name1[0]"."+"."$name[1]".".txt";
        $fhandle = fopen($file, 'w');
        $query = "ractip "."$file1"." "."$file2";

        $exec = shell_exec($query);
        print $exec;
        fwrite($fhandle, $exec);
        fclose($fhandle);
        if ($i == $count){
            $i = 1;
            $a++;
        }else{
            $i++;
        }
    }
?>

这是脚本。我基本上使用一个工具来获得大约3750万个组合的结果,所以你可以理解它不是我自己可以做的事情,因此出现了这个脚本,之前我把所有候选人分成了单独的文件,所以这就是$ name变量的解释我是这样称呼他们的。

问题是shell_exec命令,初步的Google搜索确实无法解释为什么它会以这种方式运行,但是shell_exec拒绝处理动态命令,相反,如果我要做一个静态命令像ractip xy.txt zy.txt它会处理它,我需要做的是构建命令然后进行shell_exec处理它,遗憾的是它没有做,如果有人可以解释为什么会真的有用此命令的行为方式如果有这种故障的解决方法。

我终于理解了一个论坛上的人说什么,当他说这些只是一些PHP不能很好的事情。

哦,是的,我正在通过浏览器部署它,不知道是否有任何帮助。

2 个答案:

答案 0 :(得分:1)

在Windows和Linux上,通过保留“/".

之类的所有斜杠,你会更好

另外,看起来你忘记了$ file1

$file2 = "D:/Ractip/mir/" . $name[1] . '.txt';
$file1 = "D:/Ractip/sequence/" . $name1[0] . ".txt";

最后,为了清楚起见,我写了

$query = "ractip '$file1' '$file2'";

$query = 'ractip ' . $file1 . ' ' . $file2 ;

你真的不需要引用单个字符串变量,即$ string和“$ string”是相同的。我用单引号/ inside / $ query引用$ file1和$ file2,因为如果名称包含空格,ractip实用程序会混淆一个文件名停止和另一个文件名启动的位置。也许这不是你的情况,但无论如何......

答案 1 :(得分:0)

我在您的代码中观察到的是,在您传递的文件名中,斜杠未正确转义:

$file2 = "D:\\Ractip\\mir\\"."$name[1]".".txt";
$file1 = "D:\\Ractip\\sequence\\"."name1[0]".".txt";

这可能导致命令搜索错误的文件