В отличие от 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)}}
Функция для отображения содержимого папки, а вывод должен быть похож на:
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', [
]);
}
}
Повеселись !