如何在Symfony 3中使用phpseclib连接到SFTP服务器

本文概述

  • 要求
  • 登录到SFTP服务器
  • 目录管理
  • 目录清单
  • 下载档案
  • 上传一个文件
  • 删除并重命名文件
与FTP不同, SFTP是唯一可以防止数据传输过程中受到攻击的文件传输协议, 从而使其成为文件传输操作的最佳协议。 PHP提供了ssh2函数, 可用于访问SFTP服务器, 但是这些方法不可靠且难以处理(更不用说安装了), 并且将生成0可移植性代码。在这种情况下, 要使用PHP连接到SFTP服务器, 我们将使用phpseclib。
在本文中, 你将学习如何在Symfony 3项目中使用phpseclib连接到SFTP服务器。
要求 为了使用PHP连接到SFTP服务器, 我们将使用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服务器:
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; // Include the SFTP component of phpseclibuse phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$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_SOMETHINGreturn $this-> render('index.html.twig', []); }}

$ sftp变量将允许你使用SFTP连接, 创建文件夹, 列出目录, 下载或上传等所有可用方法。
目录管理 目录管理包含与目录, 文件夹或文件进行交互所需的基本命令和任务。在最著名的目录管理任务中, 你将找到:
  • 创建目录(mkdir)。
  • 目录之间的导航(chdir)。
  • 消除目录(rmdir和delete以递归)。
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; // Include the SFTP component of phpseclibuse phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$sftp-> 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获取当前目录的内容:
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$sftp-> login('username', 'password')) {throw new \Exception('Cannot login into your server !'); }$sftp-> chdir('/var/www/vhosts/ourcodeworld.com'); // open directory 'ourcodeworld.com'// Send a variable named data into the twig view to be dumpedreturn $this-> render('index.html.twig', ['data' => ['list' => $sftp-> nlist(), // == $sftp-> nlist('.')'raw_list' => $sftp-> rawlist() // == $sftp-> rawlist('.')] ]); }}

在这种情况下, 我们已经导航到ourcodeworld.com文件夹, 并且将使用前面提到的命令列出该文件夹的内容。在我们的树枝视图(index.html.twig)中, 我们使用了{{dump(data)}}函数来显示文件夹的内容, 并且输出应类似于:
如何在Symfony 3中使用phpseclib连接到SFTP服务器

文章图片
列表项包含字符串数组和仅包含文件和文件夹名称的字符串。 raw_list项目将包含一个数组, 其中文件夹或文件的名称作为索引和内容, 将有更多敏感信息, 如创建日期, 权限, 大小等。
请注意, 你可以使用size, stat和lstat方法获取有关文件夹或文件的特定信息, 而无需列出目录的所有内容, 即:
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$sftp-> login('username', 'password')) {throw new \Exception('Cannot login into your server !'); }$directory = '/var/www/vhosts/ourcodeworld.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返回的关联数组的’ size’ 索引。
下载档案 你可以下载文件以将其保存在本地路径中, 也可以使用get方法检索文件的内容(作为文本)。
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$sftp-> login('username', 'password')) {throw new \Exception('Cannot login into your server !'); }$filepath = '/www/vhosts/ourcodeworld.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方法。此方法期望将文件上传到的远程路径作为第一个参数, 并期望将文件上传的路径作为第二个参数。
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$sftp-> 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', []); }}

删除并重命名文件 要删除文件夹和文件, 请使用delete方法。如果要重命名文件, 请使用重命名方法。
< ?phpnamespace sandboxBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use phpseclib\Net\SFTP; class DefaultController extends Controller{public function indexAction(){$sftp = new SFTP('myserver.sftpdirection.com'); if (!$sftp-> login('username', 'password')) {throw new \Exception('Cannot login into your server !'); }$filepath = '/www/vhosts/ourcodeworld.com/myfile.txt'; $folderpath = '/www/vhosts/ourcodeworld.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', []); }}

【如何在Symfony 3中使用phpseclib连接到SFTP服务器】玩得开心 !

    推荐阅读