本文概述
- 要求
- 登录到SFTP服务器
- 目录管理
- 目录清单
- 下载档案
- 上传一个文件
- 删除并重命名文件
在本文中, 你将学习如何在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)}}函数来显示文件夹的内容, 并且输出应类似于:
文章图片
列表项包含字符串数组和仅包含文件和文件夹名称的字符串。 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服务器】玩得开心 !
推荐阅读
- 如何在PHP中加密由TCPDF生成的PDF(密码保护)
- 如何在Symfony 3中使用Twig(或在控制器中)在表单上显示所有(或单个)错误
- 如何为特定活动禁用Android Soft Keyboard()
- 没有标签视图使用android(labelFor =“@ + id / @ + id /”属性指向此文本字段)
- 如何连续删除键盘退格键上的字符长按android
- android如何将EditText光标设置为其文本的末尾[复制]
- SetEditable在最新的Android版本中不起作用
- Android EditText Capital Characters
- Android(TextInputLayout不同inputTypes的不同间距)