Как скопировать сервер папок на сервер с помощью phpseclib?

я хочу создать резервную копию данных с сервера на сервер, используя библиотеку phpseclib. это недавно скрипт:

<?php
include "lib/Crypt/RSA.php";
include "lib/Crypt/Base.php";
include "lib/Crypt/RC4.php";
include "lib/Crypt/AES.php";
include "lib/Net/SFTP.php";
include "lib/Math/BigInteger.php";

set_include_path('lib/'); 

$sftp = new Net_SFTP('172.1.xxx.xx');
if (!$sftp->login('root', 'xxxx')) {
    exit('login failed');
}

$sftp->chdir('/opt/oss/server/var/fileint/fm');
$files = $sftp->nlist('.', true);
foreach ($files as $file) {
    if ($file == '.' || $file == '..') {
        continue;
    }
    $dir = './Alarm/' . dirname($file);
    if (!file_exists($dir)) {
        //mkdir($dir, 0777, true);
    }
    file_put_contents($dir . '/' . $file, $sftp->get($file));
}

но все равно ошибка -> ПРЕДУПРЕЖДЕНИЕ PHP: file_put_contents ()

скопировать все файлы и папку

сервер 1

к

сервер 2

Почему вы закомментировали mkdir? В любом случае, см. stackoverflow.com/a/36558913/569976

neubert 12.03.2019 05:48

все еще ошибка «Предупреждение PHP: file_put_contents», потому что я хочу скопировать папку на другой сервер

Iman Firdaus 12.03.2019 07:33
file_put_contents создает файл локально, если только вы не используете php.net/manual/en/wrappers.php (а это не так). Если вы хотите скопировать его на сервер еще один и можете получить доступ к этому другому серверу через SFTP, могу ли я предложить вам использовать два экземпляра Net_SFTP? Тогда вы могли бы сделать $sftp2->put($dir . '/' . $file, $sftp->get($file));. Обратите внимание, что вам все еще, вероятно, нужно будет сделать $sftp2->mkdir($dir, 0777, true);.
neubert 12.03.2019 14:14

@eubert: можете ли вы дать полное объяснение сценария.

Iman Firdaus 13.03.2019 10:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
886
1

Ответы 1

Создание вашего скрипта:

<?php
set_include_path('lib/'); 

include "lib/Net/SFTP.php";

$sftp = new Net_SFTP('172.1.xxx.xx'); // source server
if (!$sftp->login('root', 'xxxx')) {
    exit('login failed');
}

$sftp2 = new Net_SFTP('172.1.xxx.xx'); // destination server
if (!$sftp2->login('root', 'xxxx')) {
    exit('login failed');
}

$sftp->chdir('/opt/oss/server/var/fileint/fm');
$files = $sftp->nlist('.', true);
foreach ($files as $file) {
    if ($file == '.' || $file == '..') {
        continue;
    }
    $dir = './Alarm/' . dirname($file);
    if (!$sftp2->file_exists($dir)) {
        $sftp2->mkdir($dir, 0777, true);
    }
    $sftp2->put($dir . '/' . basename($file), $sftp->get($file));
}

Это скопирует каталог с одного удаленного сервера на другой удаленный сервер. Обратите внимание: если вы хотите скопировать каталог с удаленного сервера на другой каталог на том же сервере, я бы просто повторно использовал объект $sftp вместо создания нового объекта $sftp2. Но это не казаться, как вы спрашиваете.

Спасибо за совет. Скрипт протестирован и отлично работает для копирования папки на другой сервер. но когда я перепроверяю только скопированную папку, файл внутри папки не копируется. prnt.sc/mxlznj

Iman Firdaus 14.03.2019 05:20

@ImanFirdaus - я обновил свой скрипт. В частности, я заменил $file на basename($file). Была также опечатка, в которой он делал $$sftp2 вместо $sftp. Наконец, в моих тестах пустые подкаталоги не копируются. Не сразу понятно, почему.

neubert 16.03.2019 01:22

Другие вопросы по теме