php ssh擴展 遠程複製文件和遠程執行代碼

php遠程copy以及執行命令

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

1. SSH2模塊的安裝

1.1 安裝需要的擴展包

  1. wget  http://www.libssh2.org/download/libssh2-1.4.2.tar.gz  
  2. tar zxf libssh2-1.4.2.tar.gz  
  3. cd libssh2-1.4.2  
  4. ./configure && make && make install  

  1. wget  http://pecl.php.net/get/ssh2-0.11.3.tgz  
  2. cd ssh2-0.11.3  
  3. phpize   (如果報錯命令沒有找到,apt-get install php5-dev)  
  4. ./configure —with-ssh2 && make && make install  

Ubuntu下可以直接安裝

apt-get install libssh2-1-dev libssh2-php

使用直接安裝方式,不需要修改php配置信息。

PS:

1.登入遠程主機:

localhost$ ssh -l jsmith remotehost

2.已連接遠程主機:

remotehost$

3.要臨時回到本地主機,輸入退出符號:“~”與“Control-Z”組合。

當你輸入“~”你不會立即在屏幕上看到,當你按下<Control-Z>並且按回車之後才一起顯示。如下,在遠程主機中以此輸入“~<Control-Z>”


1.2 修改php配置信息

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

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

1.3 重啓web服務器

  1. /etc/init.d/lighttpd restart  

1.4 查看是否加載了ssh2

  1. [root@localhost ~]php -m | grep ssh2  
  2. ssh2  

2. SSH2模塊的連接應用

SSH2連接有兩種方式,分別是用戶名密碼,ssh密鑰形式。

2.1 用戶名與密碼

  1. $connection = ssh2_connect("192.168.6.222",22);  
  2. if (ssh2_auth_password($connection,"veno","ubuntu"))  
  3. {  
  4.          echo "Authentication Successful! ";  
  5. }else{  
  6.          die("Authentication Failed...");  
  7. }  

2.2 ssh密鑰

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

 

Ps: 密鑰生成:

在服務器192.168.6.229上面以root登錄

  1. #ssh-keygen  

有什麼提問基本上回車即可

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

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

  1. 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: 接收文件時,後面文件名可以爲空,如:

  1. 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:發送文件時,後面的文件名不能爲空,如:

  1. 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上的命令具體實例:

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

附件:測試中應用到的php代碼

  1. <?php  
  2. echo "是訪問到這裏來了";  
  3. $connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa'));  
  4. if (ssh2_auth_pubkey_file($connection'root',  
  5.                           '/root/.ssh/id_rsa.pub',  
  6.                           '/root/.ssh/id_rsa'))  
  7. {  
  8.   echo "Public Key Authentication Successful\n";  
  9.   //$flag=ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/');  
  10.   //接收時,後面文件名可以爲空  
  11.   //$flag=ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');  
  12.   //發送時,後面的文件名不能爲空  
  13.   //echo $flag;  
  14.   $tcmd="cd /home/veno/gateway/radiusclient;";  
  15.   $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";  
  16.   $stream = ssh2_exec($connection$tcmd);  
  17.   stream_set_blocking($stream,true);  
  18.   echo stream_get_contents($stream);   
  19. else {  
  20.   echo ('Public Key Authentication Failed');  
  21. }  
  22. echo "<br/>";  
  23. $connection = ssh2_connect('192.168.6.222', 22);  
  24. ssh2_auth_password($connection'veno''*******');  
  25. $tcmd="cd /home/veno/gateway/radiusclient;";  
  26.   $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";  
  27.   $stream = ssh2_exec($connection$tcmd);  
  28.   echo "<br/>";  
  29.   echo "-----------------------------------------------";  
  30.   stream_set_blocking($stream,true);  
  31.   echo stream_get_contents($stream);   
  32.   echo "-----------------------------------------------";  
  33. echo "<br/>";  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章