代码php扩展PHP使用ssh2连接sftp
AlonPHP使用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 { private $connect;
private $sftp;
public function __construct($host, $username, $password, $port = 22) {
$sftpConfig = [ "host" => $host, "username" => $username, "password" => $password, "port" => $port, ];
$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); } } }
|