PHP使用ssh2连接sftp

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);
}
}
}