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 );
}
?>
答案 0 :(得分:1)
为什么不能使用PHP?
而不是添加特定于操作系统的代码使用仅适用于linux的shell脚本的替代方法
system('/bin/rm -rf ' . escapeshellarg($dir));
答案 1 :(得分:-1)
没有。
资格:如果存在满足相同要求的本机PHP函数,则不会。
您是否将用户定义的数据提供给shell命令?如果用户添加分号和一些恶意代码怎么办?
阅读本文:http://www.golemtechnologies.com/articles/shell-injection
使用shell需要更多的复杂性以确保安全性,所以除非你需要做的事情真的很模糊(我不能想到任何与之相符的东西),它&# 39;这是一种不必要的风险。
Shell参数对特定操作系统行为进行假设。如果你知道你将永远在debian / redhat / osx / windows上,那么也许你不在乎。也许其他人会晚些时候。这是一个很好的做法&#39;因素。