网站地图    收藏   

主页 > php专栏 > php环境搭建 >

php无阻塞SSH客户端实例

来源:未知    时间:2014-11-24 23:53 作者:xxadmin 阅读:

[导读] 之前工作中必须和国外服务器打交道,延迟和丢包问题有时候非常严重,已经到了不可忍受的地步,输入一条sql都是很费劲的事情,google搜了一遍没有找到非阻塞的ssh客户端,PHP有SSH2扩展,利用...

之前工作中必须和国外服务器打交道,延迟和丢包问题有时候非常严重,已经到了不可忍受的地步,输入一条sql都是很费劲的事情,google搜了一遍没有找到非阻塞的ssh客户端,PHP有SSH2扩展,利用标准输入输出理论上可以实现一个基于命令的SSH客户端,这样就解决了网络问题带来的不便,于是开发了一个PHP非阻塞SSH客户端.

价值:基于命令,最大程度解决了网络延迟和丢包问题,windows和Linux下测试通过.

不足:没有自动补全功能,没有sftp和scp等其他功能,没有颜色和粗体显示,个别情况下显示上不是很完美,因为现在基本不用它了,所以暂时先不进行改进.

因为是框架中的一个类,所以个别通用函数(比如debug_print())需要自己提供,我这里就不改写了,代码如下:

  1. <?php 
  2. class FSSH{ 
  3.  private $conn
  4.  private $shell
  5.  
  6.  /** 
  7.  * key=String 密码认证,key=array('pub'=>,'pri'=>,'type'=>,'phrase'=>)密钥认证 
  8.  * 密钥认证type分为两种:ssh-rsa,ssh-dss  
  9.  * $host[addr]=String 地址,$host['fp']=array() 服务器指纹 
  10.  */ 
  11.  function __construct($host,$user,$key){ 
  12.   if(emptyempty($host['addr'])){ 
  13.    debug_print('Host cant't be emptyempty',E_USER_ERROR); 
  14.   } 
  15.   if(emptyempty($host['fp'])){ 
  16.    debug_print('finger print is not specified',E_USER_ERROR); 
  17.   }//开源代码phpfensi.com 
  18.   $this->stdin=fopen('php://stdin','r'); 
  19.   $this->stdout=fopen('php://stdout','w'); 
  20.   if(false!==strpos($host['addr'],':')){ 
  21.    $temp=explode(':',$host['addr']); 
  22.    $host['addr']=$temp[0]; 
  23.    $port=$temp[1]; 
  24.   }else
  25.    $port=22; 
  26.   } 
  27.   if(is_string($key) || emptyempty($key['type'])){ 
  28.    $methods=null; 
  29.   }else
  30.    $methods=array('hostkey'=>$key['type']); 
  31.   } 
  32.   $conn=ssh2_connect($host['addr'],$port,$methods,array('disconnect'=>array($this,'disconnect'))); 
  33.   $fp=ssh2_fingerprint($conn,SSH2_FINGERPRINT_MD5); 
  34.   $success=false; 
  35.   $fpOK=false; 
  36.   if(in_array($fp,$host['fp'])){ 
  37.    $fpOK=true; 
  38.   }else
  39.    fwrite($this->stdout,"$fpnIs fingerprint OK ?(y/n)"); 
  40.    $input=strtolower(stream_get_line($this->stdin,1)); 
  41.    if($input=='y'){ 
  42.     $fpOK=true; 
  43.    }else
  44.     $fpOK=false; 
  45.    } 
  46.   } 
  47.   if($fpOK){ 
  48.    if(is_array($key)){ 
  49.     if (ssh2_auth_pubkey_file($conn,$user,$key['pub'],$key['pri'],$key['phrase'])){ 
  50.      $success=true; 
  51.     }else
  52.      debug_print('Public Key Authentication Failed',E_USER_ERROR); 
  53.     } 
  54.    }elseif(is_string($key)){ 
  55.     if(ssh2_auth_password($conn,

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论