PHP使用ssh2连接sftp

最近使用laravel 8文件上传的sftp功能,使用的是 phpseclib 2.0。发现连接不上对方使用sftpgo搭建的服务。报错

No compatible key exchange algorithms found,看起来是加密方式不匹配。看laravel9之后使用的是phpseclib 3.0。不知道能不能连接上。但是当前项目版本不能改变。只能换其他方式,使用ssh2来连接

给php安装ssh2扩展

  • 查看是否已安装ssh2扩展 php -m | grep "ssh2"
  • 安装ssh2扩展
系统 命令
mac pecl install ssh2
centos yum install php-ssh2

php封装sftp类

<?php

namespace App\Services;

class SftpService
{
    // 连接为NULL
    private $connect;

    //sftp resource
    private $sftp;

    /**
     *  构造函数.
     */
    public function __construct($host, $username, $password, $port = 22)
    {

        $sftpConfig = [
            "host" => $host,     //SFTP服务器ip地址
            "username" => $username, //SFTP服务器用户名
            "password" => $password, //SFTP服务器密码
            "port" => $port,   //SFTP服务器端口号
        ]; //secret

        $this->connect = ssh2_connect($sftpConfig['host'], $sftpConfig['port']);

        // 使用用户名和密码登录
        ssh2_auth_password($this->connect, $sftpConfig['username'], $sftpConfig['password']);
        $this->sftp = ssh2_sftp($this->connect);
    }

    // 下载文件
    public function download($remote, $local): bool
    {
        return copy("ssh2.sftp://{$this->sftp}" . $remote, $local);
    }

    // 文件上传
    public function upload($remote, $local): bool //, $file_mode = 0777
    {
        return copy($local, "ssh2.sftp://{$this->sftp}" . $remote);
    }

    // 创建目录
    public function mkdir($path)  //使用创建目录循环
    {
        ssh2_sftp_mkdir($this->sftp, $path, 0777, true);
    }

    public function files($remote): bool|array
    {
        $files = scandir("ssh2.sftp://{$this->sftp}{$remote}");
        return array_diff( $files, ['.','..']);
    }

    // 判段目录或者文件是否存在
    public function exits($dir): bool
    {
        return file_exists("ssh2.sftp://{$this->sftp}" . $dir);
    }

    public function __destruct() {
        if ($this->connect) {
            ssh2_disconnect($this->connect);
        }
    }
}

煎和熬都是变美味的方式,加油也是