如何通过PHP启动和关闭远程服务器上的某个软件,譬如Memcached。对于俺这个刚刚掌握PHP编程皮毛的菜鸟来说,最直接不过的想法就是用exec函数执行SSH命令呗,先把运行Apache+PHP的服务器与远程服务器配置一下SSH无密码访问,然后在exec函数里直接使用SSH命令远程执行相关操作。但如此这般实现了相关代码的编写后却遇到了一个超越俺理解能力的问题,譬如用于实现SSH远程操作的文件为test_ssh.php,那么在命令行下使用php命令直接执行php test_ssh.php,程序可以成功执行,但是把test_ssh.php拿到Apache下去运行,代码里的exec函数却总是返回错误码255,令人好不烦恼!众看客们如有人知晓个中缘由,还望不吝赐教,反正俺是不懂。
后来在网上查了查,没有找到任何线索,倒是发现可以为PHP安装SSH2扩展,这才知道所谓使用exec函数直接执行SSH命令终归是野路子,为PHP安装扩展才是正道。于是乎捣鼓了半天,成功安装并试用了SSH2扩展。现总结一下安装方法,希望能为遇到类似问题的菜鸟们提供帮助。
首先,为PHP安装SSH2扩展需要两个软件包,libssh2和ssh2。两者的最新版本分别为1.4.2和0.12,下载地址分别为http://www.libssh2.org/download/和http://pecl.php.net/package/ssh2。这里我们可以均下载最新版本,libssh2的源码包为libssh2-1.4.2.tar.gz,ssh2的源码包为ssh2-0.12.tgz。
其次,解压并安装libssh2和ssh2。其中,libssh2需要先安装,ssh2后安装。安装步骤如下:
# tar -zxvf libssh2-1.4.2.tar.gz
# cd libssh2-1.4.2
# ./configure --prefix=/usr/local/libssh2
# make && make install
以上为安装libssh2,这里需要记住libssh2的安装目录,因为在安装ssh2的时候还会用到。
# tar -zxvf ssh2-0.12.tgz
# cd ssh2-0.12
# phpize
# ./configure --prefix=/usr/local/ssh2 --with-ssh2=/usr/local/libssh2
# make
执行完以上过程后,在当前目录下的modules目录下会生成一个ssh2.so文件,这就是扩展PHP所需要的,将该文件拷贝到PHP库的存储目录下在修改PHP的配置文件即可。
# cp modules/ssh2.so /usr/lib64/php/modules/
注:PHP库的存储目录可能因系统而异,本博主的机器上是/usr/lib64/php/modules/
# vi /etc/php.ini
# 向该文件中添加内容:extension=ssh2.so
此时为PHP扩展SSH2就已经完成了,为了验证是否安装成功,我们可以通过执行一下命令来验证。
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp  
ssh2
libssh2 version => 1.4.2
banner => SSH-2.0-libssh2_1.4.2
最后,我们再通过一个简单的PHP程序来试用SSH2,该程序首先连接远程服务器,然后执行相关操作,最后读取操作执行的返回结果,具体例子代码如下。
<?php
    $user="user";
    $pass="password";
    $connection=ssh2_connect('202.112.113.250',22);
    ssh2_auth_password($connection,$user,$pass);
    $cmd="ps aux";
    $ret=ssh2_exec($connection,$cmd);
    stream_set_blocking($ret, true);
    echo (stream_get_contents($ret));
?>
zhuanzi:http://blog.sina.com.cn/s/blog_48c95a1901018nq1.html

如果要创建文件需要有权限

writer:copperpeas http://csq-3.blog.163.com/blog/static/38738439201101543127935/

<?php
/*
*    通过SSH登录到远程主机,实现传递文件的功能
*/
//define('EXT_DIR',realpath(dirname(__FILE__)));  //当前目录
define('SSH_USER','root');
define('SSH_PASSWORD','//mll@$c');
define('SSH_PORT',22);
define('SSH_HOST','image.meilele.com');//远程主机
define('REMOTE_DIR_EXT','/var/www/meilele_100514/bbs');  //要操作的远程根目录
//实现传输图片到远程主机,返回bool,参数分别为本地的图片路径,远程图片路径,以及要新建的目录
$local="1.gif";//本地图片
$remote="/attachments/1101141013d18b94985c13732f.jpg";
imageSend($local,$remote);
function imageSend($local,$remote,$new_dir_arr = array())
{
    
 if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
    $connection = ssh2_connect(SSH_HOST, SSH_PORT);
    
 if (!$connection) die('SSH Connection failed');
    
 if (ssh2_auth_password($connection, SSH_USER, SSH_PASSWORD))
    {
        $sftp = ssh2_sftp($connection);
       
        $dir = explode('/',$remote);
        $path = REMOTE_DIR_EXT;
        for($i = 0; $i<count($dir)-1;$i++)  //建立目录
        {
            if($dir[$i])
            {
                $path .= '/'.$dir[$i];
                ssh2_sftp_mchkdir($sftp, $path);
            }
        }
        if(substr($remote,0,1) != '/') $remote = '/'.$remote;
        $remote = REMOTE_DIR_EXT.$remote;
  //echo ($remote);
        ssh2_scp_send($connection, $local, $remote, 0777);  
    }
    else
    {
        die('SSH Connection failed');
    }
}

function ssh2_sftp_mchkdir($sftp,$path) 
{
 ssh2_sftp_mkdir($sftp, $path);
}
?>

参考函数:http://docs.php.net/manual/zh/function.ssh2-sftp-mkdir.php

ssh2 php扩展的更多相关文章

  1. php的ssh2扩展安装

    折腾半天,结论如下: 1.先需要openssl 用which openssl看是否已安装 2.然后libssh2 用rpm -ql libssh2查看 3.下载源码的shh2x.x.x.tgz的包 4 ...

  2. 利用Php ssh2扩展实现svn自动提交到测试服务器

    1.安装ssh2扩展 (1)window . 下载 php extension ssh2 下载地址 http://windows.php.net/downloads/pecl/releases/ssh ...

  3. windows环境下为php打开ssh2扩展

    安装步骤 1. 下载 php extension ssh2下载地址 http://windows.php.net/downloads/pecl/releases/ssh2/0.12/ 根据自己PHP的 ...

  4. PHP7 学习笔记(一)Ubuntu 16.04 编译安装Nginx-1.10.3、 PHP7.0.9、Redis3.0 扩展、Phalcon3.1 扩展、Swoole1.9.8 扩展、ssh2扩展(全程编译安装)

    ==================== PHP 7.0 编译安装================== wget http://cn2.php.net/get/php-7.0.9.tar.bz2/fr ...

  5. 基于LNMP环境的ssh2扩展

    openssl: 加密算法集合,C语言实现 libssh2:ssh2协议库库,C语言实现 PECL/ssh2: libssh2的php扩展,允许php程序调用libssh2中的函数 依赖关系:PECL ...

  6. 在OS X系统中php访问sftp时需要ssh2扩展的安装

    php -v brew install homebrew/php/php55-ssh2 [实现方式] <?php $connection = ssh2_connect('192.168.0.14 ...

  7. 使用phpize安装php扩展

    环境: CentOs 6.3 php 7 nginx 举例: 安装ssh2扩展 1.登陆http://pecl.php.net,搜索ssh2,如下图所示,注意版本的选择要根据php的版本来 2.下载s ...

  8. PHP 开启 ssh2

    首先,为PHP安装SSH2扩展需要两个软件包, libssh2和ssh2(php pecl拓展). 两者的最新版本分别为libssh2-1.5.0.tar.gz和ssh2-0.12.tgz,下载地址分 ...

  9. SSH2.0编程 ssh协议过程实现

    之前为了自己做一套SSH,先自己实现了一套telnet.但经过这么多天的苦逼,发现以前的工作都是徒劳.ssh的协议很繁杂,核心的内容在于密码算法,而且自己很难在网上找到周全的细节讲解与详细的实现,只有 ...

随机推荐

  1. Xamarin.Android提示aapt退出,代码为255

    Xamarin.Android提示aapt退出,代码为255 错误信息:”aapt.exe”已退出,代码为255.出现这种问题,通常是由于该项目所使用Android SDK不完整.通过SDK Mana ...

  2. 简单几何(判断矩形的位置) UVALive 7070 The E-pang Palace(14广州B)

    题目传送门 题意:给了一些点,问组成两个不相交的矩形的面积和最大 分析:暴力枚举,先找出可以组成矩形的两点并保存起来(vis数组很好),然后写个函数判断四个点是否在另一个矩形内部.当时没有保存矩形,用 ...

  3. MVC 依赖注入扩展

    需求: 小明想要完成一个功能F,需要一把锤子T. 有两种办法可以实现: 1)小明很爱动手,精力很旺盛,于是,自己创建一个具有功能F的锤子T,并使用T来完成F: 2)小明很懒,天天睡大觉,于是,他叫小健 ...

  4. Sky数[HDU2097]

    Sky数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. ! cocos2d sprintf的问题

    char dong[100]; sprintf(dong,"%s","dongshen"); CCLOG(dong); 以上正确 char dong[100]; ...

  6. extjs 选项卡

    yufenghou extjs 选项卡 <%@ page language="java" import="java.util.*" pageEncodin ...

  7. BZOJ3570 : DZY Loves Physics I

    考虑两个质量均为m,速度分别v1.v2的小球发生完全弹性碰撞的影响: 由动能守恒得: $\frac{1}{2}mv_1^2+\frac{1}{2}mv_2^2=\frac{1}{2}mv_1'^2+\ ...

  8. BZOJ3630 : [JLOI2014]镜面通道

    从左边不能到达右边当且仅当存在一条与上下底边相连的分割线将它们分开 设下底边为S,上底边为T,每个元件作为点,有公共部分的两个点互相连边 最后拆点求最小割 #include<cstdio> ...

  9. TYVJ P1075 硬币游戏 Label:dp

    背景 农民John的牛喜欢玩硬币,所以John就为它们发明了一个新的两人硬币游戏,叫做Xoinc. 描述 最初地面上有一堆n个硬币(5<=n<=2000),从上面数第i个硬币的价值为C_i ...

  10. jQuery 跨域访问问题解决方法(转)

    转自:http://www.jb51.net/article/21213.htm 浏览器端跨域访问一直是个问题, 多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记 ...