SSH Method in PHP

2011年11月15日 星期二

SSH Method in PHP


目前因為工作關係,所以對PHP有一些研究,剛好有需要用到SSH來對遠端的LINUX抓資料,故在此紀錄三種SSH使用的方式,並且比較所需時間和限制。

*需要把ssh2.so給extension到php.ini才能在PHP中使用SSH


檔案大小約10k

Method 1:
透過ssh2_exec($connection,$command)方式連結到遠端的電腦下指令抓資料,如果要一次下許多 指令,就必需用\n來間斷,或者使用&&來連結,但是遇到一個指令發生錯誤時,就會造成後續的指令沒辦法繼續執行,所以需要後續兩種方式來改良。

$ip="xx.xx.xx.xx";

$_user = "root";

$_passord = "";
$_port="22";

if (!($connection=@ssh2_connect($ip, "22")))
{
          echo "Can't Connect";
}else {
          if(!@ssh2_auth_password($connection,$_user,$_passord))
          {
                    echo "Invalid Password";
          }else{
                    ssh2_exec($connection, "scp /mnt/test_thread_socket_client1.c root@".$_SERVER['SERVER_ADDR'].":/mnt/1.c \n exit");
          }


}



Method 2:
透過include ssh2.php去抓資料,這種方式的好處是可以把各個指令分別用$mv_shell->writeShell()這種呼叫使用,這種方式可以有效避免單一指令執行失敗,造成後續指令繼續執行問題,但是透過這種方式遇到帳號密碼錯誤,失去連線的狀況時,有可能會一直卡在連線狀況,沒有回應,所以外層再包一層去解決密碼錯誤和失去連線的情況,這種方式是最耗時。 ps.ssh2.php是網路上某位大大所寫的php function,可以到網路搜尋。

include_once("ssh2.php");$ip="xx.xx.xx.xx";
$_user = "root";
$_passord = "";
$_port="22";
if (!($connection=@ssh2_connect($ip, "22")))
{
          echo "Can't Connect";
}else {

  if(!@ssh2_auth_password($connection,$_user,$_passord))

        {

                echo "Invalid Password";

        }else{

                    ssh2_exec($connection, "exit");


                    $scp_shell = new ssh2($ip);
                    $scp_shell->authPassword("root","");
                    $scp_shell->openShell("xterm");
                    $scp_shell->writeShell("scp /mnt/test_thread_socket_client1.c root@".$_SERVER['SERVER_ADDR'].":/mnt/1.c");
                    $scp_shell->writeShell("logout");
                    $scp_shell->getResult();
          }
}





Method 3:
ssh2_scp_recv()這方式是PHP內的語法,不需要使用方法二的ssh2.php,就可以解決前一指令執行失敗,所可能造成後續連續中段的問題,這種方式的執行速度相當快,但是遇到錯誤的密碼時也是會卡住連線,沒有回應,所以外層需要再包一層去判斷密碼錯誤的問題。

$ip="xx.xx.xx.xx";

$_user = "root";
$_passord = "";
$_port="22";
if (!($connection=@ssh2_connect($ip, "22")))
{
          echo "Can't Connect";
}else {
        if(!@ssh2_auth_password($connection,$_user,$_passord))
        {
                echo "Invalid Password";
        }else{
                ssh2_exec($connection, "exit");

                $connection2 = ssh2_connect($ip, 22);
                ssh2_auth_password($connection2, 'root', '');
                ssh2_scp_recv($connection2, '/mnt/test_thread_socket_client.c', '/mnt/1.c');
        }
}



執行所需時間比較:

抓一個檔案的回應時間
  1. Method 1:: Cost 0.77803492546082 sec 
  2. Method 2: Cost 1.3200099468231 sec 
  3. Method 3: Cost 0.63576698303223 sec 
當遇到空ip的時候的回應時間
  1. Method 1 : Cost 2.0159571170807 sec 
  2. Method 2: Cost 3.0096590518951 sec 
  3. Method 3: Cost 3.0093159675598 sec 
當密碼錯誤時的回應時間
  1. Method 1: Cost 5.2045171260834 sec 
  2. Method 2: Cost 無回應 
  3. Method 3: Cost 5.2065389156342 sec 
連結到win7時的回應時間 (取決於time-out設定)
  1. Method 1: Cost 60.061077833176 sec 
  2. Method 2: Cost 60.060883045197 sec 
  3. Method 3: Cost 60.060894012451 sec 
當遠端沒有此檔案時的回應時間
  1. Method 1:: Cost 0.797611951828 sec 
  2. Method 2: Cost 1.3146259784698 sec 
  3. Method 3: Cost 0.64013385772705 sec


    結論:
            方法三可以解決方法一的連鎖失敗和方法二的所需時間過長的問題,是目前我所使用的方式,但如果不考慮連續失敗的問題(單一指令)時,可以直接使用方法一,或者不考慮密碼會發生錯誤的情況下,直接使用方法三最內層的方式也是一種相當快的方式(scp 回應時間大概是0.3 sec),如果有錯請幫忙指正一下~感恩!



    0 意見 :

    張貼留言