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