程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php遠程copy以及執行命令

php遠程copy以及執行命令

編輯:關於PHP編程

php遠程copy文件以及在遠程服務器中執行命令時,所用到的模塊是ssh2,以後所有的操作都依據ssh2連接句柄完成。


1. SSH2模塊的安裝
1.1 安裝需要的擴展包

[plain] 
wget   
tar zxf libssh2-1.4.2.tar.gz 
cd libssh2-1.4.2 
./configure && make && make install 

wget   
tar zxf libssh2-1.4.2.tar.gz
cd libssh2-1.4.2
./configure && make && make install

[plain]
wget   
cd ssh2-0.11.3 
phpize   (如果報錯命令沒有找到,apt-get install php5-dev) 
./configure —with-ssh2 && make && make install 

wget 
cd ssh2-0.11.3
phpize   (如果報錯命令沒有找到,apt-get install php5-dev)
./configure —with-ssh2 && make && make install
1.2 修改php配置信息

[plain] 
cd  /etc/php5/cgi 
vim  php.ini 
添加項:extension=/usr/lib/php5/20090626/ssh2.so 
     ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。 

cd  /etc/php5/cgi
vim  php.ini
添加項:extension=/usr/lib/php5/20090626/ssh2.so
     ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。

[plain] 
cd  /etc/php5/cli 
vim  php.ini 
添加項:extension=/usr/lib/php5/20090626/ssh2.so 
     ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。 

cd  /etc/php5/cli
vim  php.ini
添加項:extension=/usr/lib/php5/20090626/ssh2.so
     ssh2.so是編譯ssh2時得到的模塊,上面是模塊的位置。
1.3 重啟web服務器

[plain] 
/etc/init.d/lighttpd restart 

/etc/init.d/lighttpd restart
1.4 查看是否加載了ssh2

[plain] 
[root@localhost ~]php -m | grep ssh2 
ssh2 

[root@localhost ~]php -m | grep ssh2
ssh22. SSH2模塊的連接應用
SSH2連接有兩種方式,分別是用戶名密碼,ssh密鑰形式。

2.1 用戶名與密碼

[php]
$connection = ssh2_connect("192.168.6.222",22); 
if (ssh2_auth_password($connection,"veno","ubuntu")) 

         echo "Authentication Successful! "; 
}else{ 
         die("Authentication Failed..."); 

$connection = ssh2_connect("192.168.6.222",22);
if (ssh2_auth_password($connection,"veno","ubuntu"))
{
       echo "Authentication Successful! ";
}else{
       die("Authentication Failed...");
}
2.2 ssh密鑰

[php] 
$connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa')); 
if (ssh2_auth_pubkey_file($connection, 'root', 
                          '/root/.ssh/id_rsa.pub', 
                          '/root/.ssh/id_rsa')) 

   echo "Public Key Authentication Successful\n"; 
} else { 
     echo ('Public Key Authentication Failed'); 

$connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'root',
                          '/root/.ssh/id_rsa.pub',
                          '/root/.ssh/id_rsa'))
{
   echo "Public Key Authentication Successful\n";
} else {
   echo ('Public Key Authentication Failed');
}

Ps: 密鑰生成:

在服務器192.168.6.229上面以root登錄


[plain] 
#ssh-keygen 

#ssh-keygen
有什麼提問基本上回車即可

後成的公鑰在~/.ssh/id_rsa.pub

如果想在229通過密鑰驗證登錄到222上面,則把229的公鑰id_rsa.pub cp到222上面,先手動登錄root,然後運行:


[plain] 
cat id_rsa.pub >> ~/.ssh/authorized_keys 

cat id_rsa.pub >> ~/.ssh/authorized_keys
這樣就可以在229上面ssh 192.168.6.229不需要輸入密碼即可登錄到222。上面php代碼在229上面也可以通過驗證。

 

3. SSH2模塊的具體應用
通過SSH2驗證通過後,得到的連接符為$connection

3.1 實現遠程copy文件
遠程服務器文件copy到本地:

bool ssh2_scp_recv ( resource $session, string $remote_file, string $local_file )

Ps: 接收文件時,後面文件名可以為空,如:


[php] 
ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/') 

ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/')

 

本地文件copy到遠程服務器

bool ssh2_scp_send ( resource $session, string $local_file, string $remote_file [, int $create_mode] )

Ps:發送文件時,後面的文件名不能為空,如:

[php]
ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml'); 

ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');
 

3.2 執行遠程服務器上的命令並取返回值
resource ssh2_exec( resource $session, string $command [, string $pty [, array $env [, int $width [, int $height [, int $width_height_type]]]]] )

在229上面執行222上的命令具體實例:


[php] 
$tcmd="cd /home/veno/gateway/radiusclient;"; 
$tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d"; 
$stream = ssh2_exec($connection, $tcmd); 
stream_set_blocking($stream,true); 
echo stream_get_contents($stream);  

$tcmd="cd /home/veno/gateway/radiusclient;";
$tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";
$stream = ssh2_exec($connection, $tcmd);
stream_set_blocking($stream,true);
echo stream_get_contents($stream);
附件:測試中應用到的php代碼
[php]
<?php 
echo "是訪問到這裡來了"; 
$connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa')); 
if (ssh2_auth_pubkey_file($connection, 'root', 
                          '/root/.ssh/id_rsa.pub', 
                          '/root/.ssh/id_rsa')) 

  echo "Public Key Authentication Successful\n"; 
  //$flag=ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/');  
  //接收時,後面文件名可以為空  
  //$flag=ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');  
  //發送時,後面的文件名不能為空  
  //echo $flag;  
  $tcmd="cd /home/veno/gateway/radiusclient;"; 
  $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d"; 
  $stream = ssh2_exec($connection, $tcmd); 
  stream_set_blocking($stream,true); 
  echo stream_get_contents($stream);  
} else { 
  echo ('Public Key Authentication Failed'); 

echo "<br/>"; 
$connection = ssh2_connect('192.168.6.222', 22); 
ssh2_auth_password($connection, 'veno', '*******'); 
$tcmd="cd /home/veno/gateway/radiusclient;"; 
  $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d"; 
  $stream = ssh2_exec($connection, $tcmd); 
  echo "<br/>"; 
  echo "-----------------------------------------------"; 
  stream_set_blocking($stream,true); 
  echo stream_get_contents($stream);  
  echo "-----------------------------------------------"; 
echo "<br/>"; 

<?php
echo "是訪問到這裡來了";
$connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'root',
                          '/root/.ssh/id_rsa.pub',
                          '/root/.ssh/id_rsa'))
{
  echo "Public Key Authentication Successful\n";
  //$flag=ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/');
  //接收時,後面文件名可以為空
  //$flag=ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');
  //發送時,後面的文件名不能為空
  //echo $flag;
  $tcmd="cd /home/veno/gateway/radiusclient;";
  $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";
  $stream = ssh2_exec($connection, $tcmd);
  stream_set_blocking($stream,true);
  echo stream_get_contents($stream);
} else {
  echo ('Public Key Authentication Failed');
}
echo "<br/>";
$connection = ssh2_connect('192.168.6.222', 22);
ssh2_auth_password($connection, 'veno', '*******');
$tcmd="cd /home/veno/gateway/radiusclient;";
  $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";
  $stream = ssh2_exec($connection, $tcmd);
  echo "<br/>";
  echo "-----------------------------------------------";
  stream_set_blocking($stream,true);
  echo stream_get_contents($stream);
  echo "-----------------------------------------------";
echo "<br/>";


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved