php的ssh2实现sftp,以及ftps
ftps协议不需要安装额外的扩展,通过CURL封装即可,先干ftps协议,搞一个下载的试试:
class Ftps {
private $server;
private $username;
private $password;
private $ch;
private $port = 990; //默认端口
public $timeout = 30;
public $error = '';
public $dir = '/';
/**
* 构造,初始化
* @param string $server 远程地址
* @param string $username 账号
* @param string $password 密码
* @param int $port 端口,默认 990
*/
public function __construct($server, $username, $password,$port='') {
$this->server = $server;
$this->username = $username;
$this->password = $password;
if($port){
$this->port = $port;
}
$this->ch = curl_init(); //初始化CURL
}
/**
* 构造 CURL ftps
* @param string $remote 远程ftps 资源
* return curl object
*/
private function curl($remote) {
curl_reset($this->ch);
$options = [
CURLOPT_URL => 'ftps://' . $this->server . ':'.$this->port . $remote,
CURLOPT_USERPWD => $this->username . ':' . $this->password,
CURLOPT_SSL_VERIFYPEER => FALSE, //不检查证书
CURLOPT_SSL_VERIFYHOST => FALSE, //不检查证书
CURLOPT_FTP_SSL => 'CURLFTPSSL_TRY', //控制和数据连接都走SSL
CURLOPT_FTPSSLAUTH => 'CURLFTPAUTH_TLS', //身份验证方法,首先尝试TLS,也可以不加
CURLOPT_TIMEOUT => $this->timeout //超时时间,默认30秒
];
curl_setopt_array($this->ch, $options);
return $this->ch;
}
/**
* 下载远程ftps资源
* @param string $filepath 远程ftps 资源
* @param string $local 本地保存路径资源
*/
public function get($filepath, $local = false) {
$filename = basename($filepath);
$remote = dirname($filepath);
if ($remote == '.') {
$remote = $this->dir;
}
if ($local === false) {
$local = $filename;
}
if ($fp = fopen($local, 'w')) {
$this->ch = $this->curl($remote . $filename);
curl_setopt($this->ch, CURLOPT_UPLOAD, 0); //非上传
curl_setopt($this->ch, CURLOPT_FILE, $fp);
$result = curl_exec($this->ch);
$error = curl_error($this->ch);
fclose($fp);
if($result === false ){
unlink($local);//如果失败,但是本地open了这个文件,干掉
$this->error = $error; //错误
return false;
}
return true;
}
return false;
}
}使用:$ftps = new ftps('192.168.1.12','账号','密码');
//$ftps->timeout = 5; //默认超时 30秒
$res = $ftps->get('111111.zip','1024.zip'); //下载这个文件,下载成功后保存为1024.zip
if( $res === false ){
echo $ftps->error; //错误信息
} 再搞搞sftp:
先安装这个扩展,win和linux上都搞一搞
一:安装:win
首先看一下自己的php版本信息,php -v或者页面phpinfo
这里有几个重要的信息,php7.2,NTS,VC15,X64。
在这里下载对应的版本:https://windows.php.net/downloads/pecl/snaps/ssh2/1.2-dev/
解压后把,php_ssh2.dll放到ext下,然后修改php.ini,添加扩展
extension=ssh2
重启一下,看看:

温馨提示:openssl扩展先安装好。
二:linux安装
稍等,
三:开干
干jb毛,用ssh2,如果是秘钥登录的话,需要一个公钥和私钥。这里不用ssh2干了,用PHP的一个组件,非常强大,不用安装ssh2扩展。原生php方式。强大,灵活。
composer require phpseclib/phpseclib
使用:
require('../vendor/autoload.php');
use phpseclib\Crypt\RSA;
use phpseclib\Net\SFTP;
$sftp = new SFTP('192.168.1.125');
$privateKey = new RSA();
$privateKey->loadKey(file_get_contents('../lib/prod_92591888_id_rsa')); //私钥方式登录
$privateKey->setPassword('private key password'); //如果私钥有密码
if (!$sftp->login('520025', $privateKey)) { //登录
throw new Exception('sFTP login failed');
}
//输出远程sftp目录,相当于linux的 ls
$filesAndFolders = $sftp->nlist();
$sftp->chdir('in'); //切换目录,成功返回true 相当于linux cd
$$sftp->get('data/20201103/20201103.csv', '20201103.csv'); //下载文件,第一个参数是远程服务器路径,第二个为本地要保存的路径,成功返回true