php shell_exec: как да копирате директория от един потребител на друг (VPS на CentOs5)

В Работи на CentOS5 + DirectAdmin.

Притежавам VPS, но от съображения за сигурност просто искам да дам цялото управление само на потребителя „продавач“.

С потребител на дистрибутор имам скрипт, който се свързва с DA на дистрибутори и създава потребител.

Проблемът ми е - как да копирам дърво на директория с ~10 000 файла, което се намира в 'потребител на риселъри' ftp, напр. /domains/hoster.dom.com/public_html/dir_to_be_copied

на нов създаден потребител, чиято парола и потребителско име знам.

Доколкото разбирам, би трябвало да е възможно това да се направи като вътрешно действие на сървъра чрез командата „shell_exec()“.

Също така, каква е командата за влизане на друг потребител във FTP и работа с неговите файлове. И възможно ли е да се свържете едновременно с двата FTP потребителя и да правите копия от един на друг.

  • Знам, че може да се предложи това регистриране да се извършва като „root“ потребител, но може би е възможно без достъп до „root“ потребител.

Благодаря.


person ozzWANTED    schedule 24.06.2010    source източник


Отговори (1)


<?php
/**
 * Copy file or folder from source to destination, it can do
 * recursive copy as well and is very smart
 * It recursively creates the dest file or directory path if there weren't exists
 * Situtaions :
 * - Src:/home/test/file.txt ,Dst:/home/test/b ,Result:/home/test/b -> If source was file copy file.txt name with b as name to destination
 * - Src:/home/test/file.txt ,Dst:/home/test/b/ ,Result:/home/test/b/file.txt -> If source was file Creates b directory if does not exsits and copy file.txt into it
 * - Src:/home/test ,Dst:/home/ ,Result:/home/test/** -> If source was directory copy test directory and all of its content into dest     
 * - Src:/home/test/ ,Dst:/home/ ,Result:/home/**-> if source was direcotry copy its content to dest
 * - Src:/home/test ,Dst:/home/test2 ,Result:/home/test2/** -> if source was directoy copy it and its content to dest with test2 as name
 * - Src:/home/test/ ,Dst:/home/test2 ,Result:->/home/test2/** if source was directoy copy it and its content to dest with test2 as name
 * @todo
 *     - Should have rollback technique so it can undo the copy when it wasn't successful
 *  - Auto destination technique should be possible to turn off
 *  - Supporting callback function
 *  - May prevent some issues on shared enviroments : http://us3.php.net/umask
 * @param $source //file or folder
 * @param $dest ///file or folder
 * @param $options //folderPermission,filePermission
 * @return boolean
 */
function smartCopy($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755))
{
    $result=false;

    if (is_file($source)) {
        if ($dest[strlen($dest)-1]=='/') {
            if (!file_exists($dest)) {
                cmfcDirectory::makeAll($dest,$options['folderPermission'],true);
            }
            $__dest=$dest."/".basename($source);
        } else {
            $__dest=$dest;
        }
        $result=copy($source, $__dest);
        chmod($__dest,$options['filePermission']);

    } elseif(is_dir($source)) {
        if ($dest[strlen($dest)-1]=='/') {
            if ($source[strlen($source)-1]=='/') {
                //Copy only contents
            } else {
                //Change parent itself and its contents
                $dest=$dest.basename($source);
                @mkdir($dest);
                chmod($dest,$options['filePermission']);
            }
        } else {
            if ($source[strlen($source)-1]=='/') {
                //Copy parent directory with new name and all its content
                @mkdir($dest,$options['folderPermission']);
                chmod($dest,$options['filePermission']);
            } else {
                //Copy parent directory with new name and all its content
                @mkdir($dest,$options['folderPermission']);
                chmod($dest,$options['filePermission']);
            }
        }

        $dirHandle=opendir($source);
        while($file=readdir($dirHandle))
        {
            if($file!="." && $file!="..")
            {
                 if(!is_dir($source."/".$file)) {
                    $__dest=$dest."/".$file;
                } else {
                    $__dest=$dest."/".$file;
                }
                //echo "$source/$file ||| $__dest<br />";
                $result=smartCopy($source."/".$file, $__dest, $options);
            }
        }
        closedir($dirHandle);

    } else {
        $result=false;
    }
    return $result;
}
?>

http://www.php.net/manual/en/function.copy.php#91256

person Marco Ceppi    schedule 25.06.2010
comment

Трябва да конвертирам голям двоичен низ (поредица от байтове) в ASCII като този таблица. Мога да започна и с шестнадесетичен низ.

Прочетох тази публикация: Преобразуване на двоични данни в низ в ruby. Намерих решение, което преобразува в знаци в разширената ASCII таблица. Бих могъл да напиша условни изрази за всеки случай, за да конвертирам, но трябва да има по-лесен начин. може ли някой да помогне

- person MrTechie; 28.02.2014