本文概述
与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)}}函数来显示文件夹的内容, 并且输出应类似于:
列表项包含字符串数组和仅包含文件和文件夹名称的字符串。 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', [
]);
}
}
玩得开心 !
评论前必须登录!
注册