道者编程


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


 



最新评论:
我要评论:

看不清楚


道知

about me

身体是革命的本钱,健身,养生,运动,公众号都有!

链接