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");
}
}
透過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');
}
}
抓一個檔案的回應時間
- Method 1:: Cost 0.77803492546082 sec
- Method 2: Cost 1.3200099468231 sec
- Method 3: Cost 0.63576698303223 sec
- Method 1 : Cost 2.0159571170807 sec
- Method 2: Cost 3.0096590518951 sec
- Method 3: Cost 3.0093159675598 sec
- Method 1: Cost 5.2045171260834 sec
- Method 2: Cost 無回應
- Method 3: Cost 5.2065389156342 sec
- Method 1: Cost 60.061077833176 sec
- Method 2: Cost 60.060883045197 sec
- Method 3: Cost 60.060894012451 sec
- Method 1:: Cost 0.797611951828 sec
- Method 2: Cost 1.3146259784698 sec
- Method 3: Cost 0.64013385772705 sec
結論:
方法三可以解決方法一的連鎖失敗和方法二的所需時間過長的問題,是目前我所使用的方式,但如果不考慮連續失敗的問題(單一指令)時,可以直接使用方法一,或者不考慮密碼會發生錯誤的情況下,直接使用方法三最內層的方式也是一種相當快的方式(scp 回應時間大概是0.3 sec),如果有錯請幫忙指正一下~感恩!
0 意見 :
張貼留言