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


Should shell commands be used for PHP file management?

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

特定的需求是删除一个目录和其中的所有文件,并复制或移动一个目录到一个新的位置,包括所有的文件/目录。

假设脚本仅在Linux操作系统上使用,否则服务器端将采取步骤检测操作系统并执行正确的shell命令。

请给出你的答案的理由。

谢谢

编辑。对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 );
}
?>

与其添加操作系统专用代码,为什么不能使用PHP呢?

  1. 删除目录PHP Manual rmdir,示例查看
  2. 复制目录PHP手动复制,示例复制递归
  3. 移动目录堆栈溢出可能存在副本

使用仅适用于linux的shell脚本的替代方案

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

No。

限定条件:如果存在一个本地PHP函数来满足相同的要求,则不需要。

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

阅读这篇文章:http://www.golemtechnologies.com/articles/shell-injection

  1. 使用shell需要更多的复杂性来确保安全性,所以除非你需要做一些非常晦涩的事情(我想不出任何可以匹配的事情),否则这是一个不必要的风险。

  2. Shell参数对特定的操作系统行为进行假设。如果你知道你将永远在debian/redhat/osx/windows上,那么也许你不在乎。也许以后会有人这么做。