shell命令应该用于PHP文件管理吗?

时间:2015-08-19 04:29:46

标签: php linux shell

shell命令是否应该用于PHP文件管理?

特殊需要是删除目录及其中的所有文件,并将目录复制或移动到包含所有包含的文件/目录的新位置。

假设该脚本仅在Linux操作系统上使用,或者如果没有,则服务器将采取步骤来检测操作系统并执行正确的shell命令。

请说明你的答案理由。

谢谢

EDIT。回应Ganesh Ghalame的帖子。以下是两个未经测试的实现。为什么要使用后者?

<?php
//bla bla bla
rrmdir($dir);
recurse_copy($src,$dst);
rcopy($src, $dst);
?>


//Option command shell commands
<?php

function rrmdir($dir) { 
    shell('rm -fr '.$dir);
}
function recurse_copy($src,$dst) { 
    shell('rm -fr '.$dst);
    shell('cp '.$src.' '.$dst);
}
function rcopy($src,$dst) { 
    recurse_copy($src,$dst);
}


?>

//Option using PHP commands
<?php

function rrmdir($dir) { 
    if (is_dir($dir)) { 
        $objects = scandir($dir); 
        foreach ($objects as $object) { 
            if ($object != "." && $object != "..") { 
                if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); 
            } 
        } 
        reset($objects); 
        rmdir($dir); 
    } 
}
function recurse_copy($src,$dst) { 
    $dir = opendir($src); 
    @mkdir($dst); 
    while(false !== ( $file = readdir($dir)) ) { 
        if (( $file != '.' ) && ( $file != '..' )) { 
            if ( is_dir($src . '/' . $file) ) { 
                recurse_copy($src . '/' . $file,$dst . '/' . $file); 
            } 
            else { 
                copy($src . '/' . $file,$dst . '/' . $file); 
            } 
        } 
    } 
    closedir($dir); 
}

// Function to remove folders and files 
function rrmdir($dir) {
    if (is_dir($dir)) {
        $files = scandir($dir);
        foreach ($files as $file)
            if ($file != "." && $file != "..") rrmdir("$dir/$file");
            rmdir($dir);
    }
    else if (file_exists($dir)) unlink($dir);
}

// Function to Copy folders and files       
function rcopy($src, $dst) {
    if (file_exists ( $dst ))
        rrmdir ( $dst );
    if (is_dir ( $src )) {
        mkdir ( $dst );
        $files = scandir ( $src );
        foreach ( $files as $file )
            if ($file != "." && $file != "..")
                rcopy ( "$src/$file", "$dst/$file" );
    } else if (file_exists ( $src ))
        copy ( $src, $dst );
}

?>

2 个答案:

答案 0 :(得分:1)

为什么不能使用PHP?

而不是添加特定于操作系统的代码
  1. 删除目录PHP Manual rmdir,示例 check this
  2. 复制目录PHP Manual copy,示例copy recursive
  3. 移动目录 stack overflow possible duplicate
  4. 使用仅适用于linux的shell脚本的替代方法

    system('/bin/rm -rf ' . escapeshellarg($dir));
    

答案 1 :(得分:-1)

没有。

资格:如果存在满足相同要求的本机PHP函数,则不会。

您是否将用户定义的数据提供给shell命令?如果用户添加分号和一些恶意代码怎么办?

阅读本文:http://www.golemtechnologies.com/articles/shell-injection

  1. 使用shell需要更多的复杂性以确保安全性,所以除非你需要做的事情真的很模糊(我不能想到任何与之相符的东西),它&# 39;这是一种不必要的风险。

  2. Shell参数对特定操作系统行为进行假设。如果你知道你将永远在debian / redhat / osx / windows上,那么也许你不在乎。也许其他人会晚些时候。这是一个很好的做法&#39;因素。