个性化阅读
专注于IT技术分析

如何在Symfony 3中使用phpseclib连接到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服务器:

<?php

namespace sandboxBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// Include the SFTP component of phpseclib
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 !');
        }
        
        // 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以递归)。
<?php

namespace sandboxBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// Include the SFTP component of phpseclib
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->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获取当前目录的内容:

<?php

namespace 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 dumped
        return $this->render('index.html.twig', [
           'data' => [
                'list' => $sftp->nlist(), // == $sftp->nlist('.')
                'raw_list' => $sftp->rawlist() // == $sftp->rawlist('.')
            ] 
        ]);
    }
}

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

列出目录phpseclib Symfony 3

列表项包含字符串数组和仅包含文件和文件夹名称的字符串。 raw_list项目将包含一个数组, 其中文件夹或文件的名称作为索引和内容, 将有更多敏感信息, 如创建日期, 权限, 大小等。

请注意, 你可以使用size, stat和lstat方法获取有关文件夹或文件的特定信息, 而无需列出目录的所有内容, 即:

<?php

namespace 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方法检索文件的内容(作为文本)。

<?php

namespace 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方法。此方法期望将文件上传到的远程路径作为第一个参数, 并期望将文件上传的路径作为第二个参数。

<?php

namespace 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方法。如果要重命名文件, 请使用重命名方法。

<?php

namespace 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', [
        ]);
    }
}

玩得开心 !

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 3中使用phpseclib连接到SFTP服务器

评论 抢沙发

评论前必须登录!