公司开发了一个很大的项目,叫我实现一个基于nginx服务器,通过Ssh协议连接到其他服务器上传一些文件,当时我就蒙了!!
百度了很多东西,后来才“小荷才露尖尖角”。
下面这个类是:php通过SSH连接服务器并远程保存文件,所用到的模块是ssh2,如果你的服务器不是SFTP协议的话,请绕路!!
<?php
class Ssh {
//连接资源
private $link;
//错误代码
private $err_code = 0;
//远程根目录
public $remote_dir_ext;
public $mode = 0644;
/**
* 连接ssh协议的服务器
* @param string $server['HOST'] 服务器IP地址
* @param string $server['USERNAME'] 用户名
* @param string $server['PASSWORD'] 密码
* @param integer $server['PORT'] 服务器端口,默认值为22
*/
public function __construct($server) {
$host = $server['HOST'];
$username = $server['USERNAME'] ? $server['USERNAME'] : '';
$password = $server['PASSWORD'] ? $server['PASSWORD'] : '';
$port = $server['PORT'] ? $server['PORT'] : '22';
$this->link = ssh2_connect($host,$port);
if(!$this->link){
$this->err_code = 1;
return false;
}
if(ssh2_auth_password($this->link, $username, $password)){
if(!empty($this->remote_dir_ext)){
$this->remote_dir_ext = '/'.trim($this->remote_dir_ext,'/').'/';
}else{
$this->err_code = 3;
return false;
}
return true;
}else {
$this->err_code = 2;
return false;
}
}
/**
* 上传文件
* @param string $remote 远程存放地址
* @param string $filename 需要保存的名字,不包含后缀
* @param string $tagname 标签名称
*/
public function upload($remote, $filename=null, $tagname='') {
if(empty($tagname)){
foreach($_FILES as $value){
$local = $value['tmp_name'];
$extension = pathinfo($value['name'], PATHINFO_EXTENSION);//后缀
}
}else{
$local = $_FILES[$tagname]['tmp_name'];
if(empty($local)){
$this->err_code = 5;
return false;
}
$extension = pathinfo($_FILES[$tagname]['name'], PATHINFO_EXTENSION);//后缀
}
$remote = trim($remote,'/').'/';
$this->mkdir($this->remote_dir_ext.$remote); // 创建目录
if(!empty($filename)){
$file = $filename;
}else{
$file = time().'_'.rand(100,999);
}
$dir_path = $this->remote_dir_ext.$remote.$file.'.'.$extension;
if(ssh2_scp_send($this->link, $local, $dir_path, $this->mode)){ //上传
return $remote.$file.'.'.$extension;
}else{
$this->err_code = 4;
return false;
}
}
/**
* 创建文件夹
* @param string $dir_path 远程目录
* @return bool
*/
public function mkdir($dir_path){
$sftp = ssh2_sftp($this->link);
return ssh2_sftp_mkdir($sftp, $dir_path);
}
/**
* 保存文件
* @param string $remote 远程存放地址
* @param string $filename 需要保存的名字,包含后缀
* @param text $text 文件内容
*/
public function put_content($remote,$filename,$text){
$sftp = ssh2_sftp($this->link);
$stream = fopen("ssh2.sftp://$sftp". $this->remote_dir_ext . $remote . $filename, 'w+');
//"ssh2.sftp://$sftp/server/html/res.ipail.com/fx/aa.html";
fwrite($stream, $text);
fclose($stream);
return $remote . $filename;
}
/**
* 获取错误信息
*/
public function get_error() {
if (!$this->err_code) return false;
$err_msg = array(
'1' => '服务器无法连接',
'2' => '未连接到服务器',
'3' => '未找到远程根目录',
'4' => '上传文件失败',
'5' => '提交的name错误',
);
return $err_msg[$this->err_code];
}
}
?>
开始实例化类:
$RemoteServer = array(
'HOST' => '',//服务器IP地址
'USERNAME' => '',//帐户
'PASSWORD' => '',//密码
'PORT' => '22',//端口
);
$ssh = new Ssh($RemoteServer);//实例化对象
$ssh->remote_dir_ext = '/server/html/';//根目录
$remote = 'admin.ipail.com/admin/html/'.date('Ym').'/';
$ShareImg = $ssh->upload($remote,'','head');
if($ShareImg){
$res = array(
'errcode' => 0,
'data' => 'http://'.$ShareImg,
);
}else{
$res = array(
'errcode' => 1,
'msg' => '上传失败:'.$ssh->get_error(),
);
}
var_dump($res);