php無阻塞SSH用戶端執行個體_PHP教程

來源:互聯網
上載者:User
之前工作中必須和國外伺服器打交道,延遲和丟包問題有時候非常嚴重,已經到了不可忍受的地步,輸入一條sql都是很費勁的事情。google搜了一遍沒有找到非阻塞的ssh用戶端,PHP有SSH2擴充,利用標準輸入輸出理論上可以實現一個基於命令的SSH用戶端,這樣就解決了網路問題帶來的不便,於是開發了一個PHP非阻塞SSH用戶端

價值:

  • 基於命令,最大程度解決了網路延遲和丟包問題。
  • windows和Linux下測試通過。

不足:

  • 沒有自動補全功能
  • 沒有sftp和scp等其他功能
  • 沒有顏色和粗體顯示
  • 個別情況下顯示上不是很完美
  • 因為現在基本不用它了,所以暫時先不進行改進。

linux 運行效果

windows下運行效果


因為是架構中的一個類,所以個別通用函數(比如debug_print())需要自己提供,我這裡就不改寫了

代碼如下 複製代碼

class FSSH{
private $conn;
private $shell;

/**
* key=String 密碼認證,key=array('pub'=>,'pri'=>,'type'=>,'phrase'=>)密鑰認證
* 密鑰認證type分為兩種:ssh-rsa,ssh-dss
* $host[addr]=String 地址,$host['fp']=array() 伺服器指紋
*/
function __construct($host,$user,$key){
if(empty($host['addr'])){
debug_print('Host cant't be empty',E_USER_ERROR);
}
if(empty($host['fp'])){
debug_print('finger print is not specified',E_USER_ERROR);
}
$this->stdin=fopen('php://stdin','r');
$this->stdout=fopen('php://stdout','w');
if(false!==strpos($host['addr'],':')){
$temp=explode(':',$host['addr']);
$host['addr']=$temp[0];
$port=$temp[1];
}else{
$port=22;
}
if(is_string($key) || empty($key['type'])){
$methods=null;
}else{
$methods=array('hostkey'=>$key['type']);
}
$conn=ssh2_connect($host['addr'],$port,$methods,array('disconnect'=>array($this,'disconnect')));
$fp=ssh2_fingerprint($conn,SSH2_FINGERPRINT_MD5);
$success=false;
$fpOK=false;
if(in_array($fp,$host['fp'])){
$fpOK=true;
}else{
fwrite($this->stdout,"$fpnIs fingerprint OK ?(y/n)");
$input=strtolower(stream_get_line($this->stdin,1));
if($input=='y'){
$fpOK=true;
}else{
$fpOK=false;
}
}
if($fpOK){
if(is_array($key)){
if (ssh2_auth_pubkey_file($conn,$user,$key['pub'],$key['pri'],$key['phrase'])){
$success=true;
}else{
debug_print('Public Key Authentication Failed',E_USER_ERROR);
}
}elseif(is_string($key)){
if(ssh2_auth_password($conn,$user,$key)){
$success=true;
}else{
debug_print('Password Authentication Failed',E_USER_ERROR);
}
}
}else{
debug_print('Fingerprint is invalid',E_USER_ERROR);
}
if($success){
$this->conn=$conn;
$this->shell=ssh2_shell($conn,null,null,1024);
}
return $success;
}

function shell(){
//最後一條命令
$last='';
//先結束shell,再結束while
$signalTerminate=false;
while(true){
$cmd=$this->fread($this->stdin);
$out=stream_get_contents($this->shell,1024);
if(!empty($out) and !empty($last)){
$l1=strlen($out);
$l2=strlen($last);
$l=$l1>$l2?$l2:$l1;
$last=substr($last,$l);
$out=substr($out,$l);
}
echo ltrim($out);
if($signalTerminate){
break;
}
if(in_array(trim($cmd),array('exit'))){
$signalTerminate=true;
}
if(!empty($cmd)){
$last=$cmd;
fwrite($this->shell,$cmd);
}
}
}

//解決windows命令列的讀取問題,沒有別的辦法了。
private function fread($fd){
static $data='';
$read = array($fd);
$write = array();
$except = array();
$result = stream_select($read,$write,$except,0,1000);
if($result === false)
debug_print('stream_select failed',E_USER_ERROR);
if($result !== 0){
$c= stream_get_line($fd,1);
if($c!=chr(13))
$data.=$c;
if($c==chr(10)){
$t=$data;
$data='';
return $t;
}
}
}

function __destruct(){
fclose($this->stdin);
fclose($this->stdout);
$this->disconnect();
}

private function disconnect(){
if(is_resource($this->conn)){
unset($this->conn);
fclose($this->shell);
}
}
}


demo

代碼如下 複製代碼

//$ssh=new FSSH(array('addr'=>'x.x.x.x:22','fp'=>array('')),'tunnel',array('pub'=>'E:Identity.pub','pri'=>'E:Identity','type'=>'ssh-rsa'));
$ssh=new FSSH(array('addr'=>'192.168.2.205','fp'=>array('54ECC700B844DCF0D40554A56C57C01E')),'root','123456');
$ssh->shell();

http://www.bkjia.com/PHPjc/632846.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632846.htmlTechArticle之前工作中必須和國外伺服器打交道,延遲和丟包問題有時候非常嚴重,已經到了不可忍受的地步,輸入一條sql都是很費勁的事情。google搜...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.