php通过SSH连接服务器并远程保存文件

公司开发了一个很大的项目,叫我实现一个基于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);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值