Как подключиться к SFTP-серверу с помощью phpseclib в Symfony 3

В отличие от FTP, SFTP является единственным протоколом передачи файлов, который обеспечивает защиту от атак в процессе передачи данных, что делает его лучшим протоколом для операций передачи файлов. PHP предлагает функции ssh2, которые вы можете использовать для доступа к SFTP-серверу, однако эти методы ненадежны и сложны в обращении (не говоря уже об установке) и генерируют код переносимости 0. В этом случае для подключения к SFTP-серверу в PHP мы будем использовать phpseclib.

В этой статье вы узнаете, как подключиться к SFTP-серверу с помощью phpseclib в проекте Symfony 3.

Требования

Чтобы подключиться к SFTP-серверу в PHP, мы будем использовать phpseclib библиотека. Phpseclib представляет собой MIT-лицензированную реализацию на чистом PHP для целочисленной арифметической библиотеки произвольной точности, полностью совместимой с PKCS # 1 (v2.1) RSA, DES, 3DES, RC4, Rijndael, AES, Blowfish, Twofish, SSH-1, SSH- 2, SFTP и X.509

Предпочтительный способ установки с помощью composer, выполните следующую команду в командной строке:

composer require phpseclib/phpseclib

Кроме того, вы можете изменить файл composer.json и вручную добавить библиотеку в качестве зависимости, а затем выполнить composer install:

{
"require": {
"phpseclib/phpseclib": "^2.0"
}
}

И вы готовы использовать phpseclib.

Вход на SFTP-сервер

Следующий фрагмент показывает, как легко войти на SFTP-сервер в контроллере:

login('username', 'password')) {
throw new \Exception('Cannot login into your server !');
}
// And you'll be able to use the SFTP tool as you wish !
// $sftp->DO_SOMETHING
return $this->render('index.html.twig', [
]);
}
}

$sftp Переменная позволит вам использовать все методы, доступные для подключения SFTP, создания папок, списка каталогов, загрузки или выгрузки и т. д.

Управление каталогами

Управление каталогами состоит из основных команд и задач, которые вам необходимы для взаимодействия с каталогом, папкой или файлами. В наиболее известных задачах управления каталогами вы найдете:

  • Создание каталога (mkdir).
  • Навигация между каталогами (chdir).
  • Устранение каталога (rmdir а также delete для рекурсивного).
login('username', 'password')) {
throw new \Exception('Cannot login into your server !');
}
$sftp->mkdir('test'); // create directory 'test'
$sftp->chdir('test'); // open directory 'test'
echo $sftp->pwd(); // show that we're in the 'test' directory
$sftp->chdir('..'); // go back to the parent directory
$sftp->chdir('/var/www/vhosts/myfolder'); // navigate to myfolder
/// DANGEROUS ZONE, THINK WHAT YOU DO BEFORE UNCOMMENT
// $sftp->rmdir('test'); // delete the directory
// if the directory had files in it we'd need to do a recursive delete
// $sftp->delete('test', true);
return $this->render('index.html.twig', [
]);
}
}

Список каталогов

Чтобы составить каталог, вам нужно знать только путь. Затем используйте команду chdir и, наконец, получите содержимое текущего каталога, используя либо nlist или же rawlist:

login('username', 'password')) {
throw new \Exception('Cannot login into your server !');
}
$sftp->chdir('/var/www/vhosts/site.com'); // open directory 'site.com'
// Send a variable named data into the twig view to be dumped
return $this->render('index.html.twig', [
'data' => [
'list' => $sftp->nlist(), // == $sftp->nlist('.')
'raw_list' => $sftp->rawlist() // == $sftp->rawlist('.')
]
]);
}
}

В этом случае мы только что перешли в папку site.com и перечислим содержимое папки, используя ранее упомянутые команды. На наш взгляд ветки (index.html.twig), мы использовали {{dump(data)}} Функция для отображения содержимого папки, а вывод должен быть похож на:

Список каталогов phpseclib Symfony 3

list Элемент содержит и массив строк только с именами файлов и папок. raw_list Элемент будет содержать массив с именем папки или файла в качестве индекса и в качестве содержимого, там будет более конфиденциальная информация, такая как дата создания, разрешения, размер и т. д.

Обратите внимание, что вы можете получить конкретную информацию о папке или файле без перечисления всего содержимого каталога, используя методы size, stat и lstat, т.е.

login('username', 'password')) {
throw new \Exception('Cannot login into your server !');
}
$directory = '/var/www/vhosts/site.com';
return $this->render('sandboxBundle:Default:index.html.twig', [
'data' => [
'size' => $sftp->size($directory),
'stat' => $sftp->stat($directory),
'lstat' => $sftp->lstat($directory)
]
]);
}
}

stat а также lstat вернуть ассоциативные массивы с разной информацией о файлах. lstat а также stat идентичны предупреждению о том, что когда рассматриваемый файл является символической ссылкой, возвращаемая информация относится к самой ссылке, а не к файлу (или каталогу), с которым она связана. size возвращает индекс размера ассоциативного массива, возвращаемого lstat,

Скачать файл

Вы можете либо загрузить файл, чтобы сохранить его по локальному пути, либо получить его содержимое (в виде текста), используя get метод.

login('username', 'password')) {
throw new \Exception('Cannot login into your server !');
}
$filepath = '/www/vhosts/site.com/myfile.txt';
// the get method returns the content of a remote file
$filecontent = $sftp->get($filepath);
// Alternatively, instead of retrieve the content, download the file
// copy the file into a local directory providing the local path as second parameter
$sftp->get($filepath, '/myPC/folder/myfile.txt');
return $this->render('index.html.twig', [
'filecontent' => $filecontent
]);
}
}

Загрузить файл

Чтобы загрузить файл на удаленный сервер, используйте метод put. Этот метод ожидает в качестве первого аргумента удаленный путь, куда будет загружен файл, а в качестве второго параметра — путь к файлу, который будет загружен.

login('username', 'mypassword')) {
throw new \Exception('Cannot login into your server !');
}
$remoteFile = '/var/www/vhosts/myfile.txt';
$localFile = '/my-local-server/mydownloadedfile.txt';
// Upload of the local path (second argument)
// into the remote path (first argument)
$sftp->put($remoteFile, $localFile);
return $this->render('index.html.twig', [
]);
}
}

Удалить и переименовать файл

Для удаления папки и файлов используйте метод удаления. Если вы хотите переименовать файл, используйте метод переименования.

login('username', 'password')) {
throw new \Exception('Cannot login into your server !');
}
$filepath = '/www/vhosts/site.com/myfile.txt';
$folderpath = '/www/vhosts/site.com'
$sftp->delete($filepath); // doesn't delete directories
// recursive delete
$sftp->delete($folderpath, true); // deletes a directory and all its contents
//rename filename1 for mynewname
$sftp->rename('filename1.txt', 'mynewname.txt');
return $this->render('index.html.twig', [
]);
}
}

Повеселись !

Ссылка на основную публикацию
Adblock
detector