php ssh2实现远程上传、下载、执行命令

php远程copy以及执行命令

php远程copy文件以及在远程服务器中执行命令时,所用到的模块是ssh2,以后所有的操作都依据ssh2连接句柄完成。

1. SSH2模块的安装

1.1 安装需要的扩展包

[plain]  view plain copy print ?
  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  

[plain]  view plain copy print ?
  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下可以直接安装

[plain] view plain copy print ?
  1. apt-get install libssh2-1-dev libssh2-php  

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

PS:

1.登入远程主机:

localhost$ ssh -l jsmith remotehost

2.已连接远程主机:

remotehost$

3.要临时回到本地主机,输入退出符号:“~”与“Control-Z”组合。

当你输入“~”你不会立即在屏幕上看到,当你按下并且按回车之后才一起显示。如下,在远程主机中以此输入“~


1.2 修改php配置信息

[plain]  view plain copy print ?
  1. cd  /etc/php5/cgi  
  2. vim  php.ini  
  3. 添加项:extension=/usr/lib/php5/20090626/ssh2.so  
  4.      ssh2.so是编译ssh2时得到的模块,上面是模块的位置。  

[plain]  view plain copy print ?
  1. cd  /etc/php5/cli  
  2. vim  php.ini  
  3. 添加项:extension=/usr/lib/php5/20090626/ssh2.so  
  4.      ssh2.so是编译ssh2时得到的模块,上面是模块的位置。  

1.3 重启web服务器

[plain]  view plain copy print ?
  1. /etc/init.d/lighttpd restart  

1.4 查看是否加载了ssh2

[plain]  view plain copy print ?
  1. [root@localhost ~]php -m | grep ssh2  
  2. ssh2  

2. SSH2模块的连接应用

SSH2连接有两种方式,分别是用户名密码,ssh密钥形式。

2.1 用户名与密码

[php]  view plain copy print ?
  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密钥

[php]  view plain copy print ?
  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登录

[plain]  view plain copy print ?
  1. #ssh-keygen  

有什么提问基本上回车即可

后成的公钥在~/.ssh/id_rsa.pub

如果想在229通过密钥验证登录到222上面,则把229的公钥id_rsa.pub cp到222上面,先手动登录root,然后运行:

[plain]  view plain copy print ?
  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: 接收文件时,后面文件名可以为空,如:

[php]  view plain copy print ?
  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:发送文件时,后面的文件名不能为空,如:

[php]  view plain copy print ?
  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上的命令具体实例:

[php]  view plain copy print ?
  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);  
  6. ssh2_exec() 是会有返回值的,而它的返回值是无格式的(无换行),但它是以stream(流的形式返回),

    显示出来,可这样进行流处理:

    stream_set_blocking($stream, true);

    echo :stream_get_contents($stream);


附件:测试中应用到的php代码

[php]  view plain copy print ?
  1. echo "是访问到这里来了";  
  2. $connection = ssh2_connect('192.168.6.222', 22, array('hostkey'=>'ssh-rsa'));  
  3. if (ssh2_auth_pubkey_file($connection'root',  
  4.                           '/root/.ssh/id_rsa.pub',  
  5.                           '/root/.ssh/id_rsa'))  
  6. {  
  7.   echo "Public Key Authentication Successful\n";  
  8.   //$flag=ssh2_scp_recv($connection, '/home/xiaozl/veno1.exe', '/home/xiaozl/');  
  9.   //接收时,后面文件名可以为空  
  10.   //$flag=ssh2_scp_send($connection, '/home/xiaozl/package.xml', '/home/xiaozl/package.xml');  
  11.   //发送时,后面的文件名不能为空  
  12.   //echo $flag;  
  13.   $tcmd="cd /home/veno/gateway/radiusclient;";  
  14.   $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";  
  15.   $stream = ssh2_exec($connection$tcmd);  
  16.   stream_set_blocking($stream,true);  
  17.   echo stream_get_contents($stream);   
  18. else {  
  19.   echo ('Public Key Authentication Failed');  
  20. }  
  21. echo "
    "
    ;  
  22. $connection = ssh2_connect('192.168.6.222', 22);  
  23. ssh2_auth_password($connection'veno''*******');  
  24. $tcmd="cd /home/veno/gateway/radiusclient;";  
  25.   $tcmd.="./nastool.sh get-status app=2b1c5364-db39-c76d-842c-11d4a81d555d";  
  26.   $stream = ssh2_exec($connection$tcmd);  
  27.   echo "
    "
    ;  
  28.   echo "-----------------------------------------------";  
  29.   stream_set_blocking($stream,true);  
  30.   echo stream_get_contents($stream);   
  31.   echo "-----------------------------------------------";  
  32. echo "
    "



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

php ssh2 scp问题解决

$connection = ssh2_connect('192.168.1.XX', 22);
$res=ssh2_auth_password($connection, 'root', 'XXX');
$re= ssh2_scp_recv($connection, '/home/test1.php', '/var/www/html/test1.php');
var_dump($res);
var_dump($re);

实验来无数次,ssh2_scp_send成功。recv失败,折腾了一整天,最后搞个两台机器间的密钥认证就解决了

原因应该就是recv时,需要本地机器的密码吧,所以没密钥认证前一直recv失败


你可能感兴趣的:(PHP)