<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[让PHP支持SSH/SSH2]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Wed, 10 Mar 2010 11:21:44 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	想要在php程序中执行scp拷贝，之前想用system函数 <br/>system("scp /from/path/file user@des_host:/to/path/file")，但是始终失败， <br/>但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的， <br/>至今找不到原因，如果哪位知道原因，麻烦告知一下。 <br/>既然这个方法不行，就换吧，不能一棵树吊死啊。google来,google去，发现原来php里有 <br/>现成的函数： <br/>http://us2.php.net/manual/en/book.ssh2.php <br/>只是要装几个包。 <br/>方法如下： <br/>http://us2.php.net/manual/en/ssh2.installation.php <br/><br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>首先要装OpenSSL。 <br/>因为自己OpenSSL已经装过了，所以直接第二步，下个libssh2直接安装。 <br/>我下的是libssh2-0.18,这个都没什么问题。 <br/>第三步要用pear安装php的ssh扩展，如果没装pear可以直接下载源码，自己编译。 <br/>http://pecl.php.net/package/ssh2 <br/><br/>我下的ssh2-0.10.tgz，解压，编译： <br/>tar -zxvf ssh2-0.10.tgz <br/>【注意源码有些问题，要修改。 <br/>把480行 <br/>#if LIBSSH2_APINO < 200412301450 <br/>… <br/>#else <br/>改为 <br/>#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450) <br/>… <br/>#else <br/><br/>把1216行: <br/>#if (LIBSSH2_APINO > 200503221619) <br/>改为 <br/>#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) &#124;&#124; <br/>(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000) <br/>】 <br/><br/>phpize && ./configure --with-ssh2 && make <br/>编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中 <br/>在php.ini中加入 extension=ssh2.so <br/>重启apache <br/>ok<br/><br/>1. 安装libssh2库<br/>yum install libssh2 libssh2-devel<br/><br/>2. 下载PECL的SSH2支持代码包(beta版本有bug，需patch)<br/>wget http://pecl.php.net/get/ssh2-0.10.tgz<br/>tar xvzf ssh2-0.10.tgz<br/>cd ssh2-0.10<br/>vi ssh2.c<br/><br/>ssh2.c patch方法如下:<br/><br/>LINE 480:<br/>search and change following line:<br/>#if LIBSSH2_APINO < 200412301450<br/>...<br/>#else<br/><br/>to:<br/>#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)<br/>...<br/>#else<br/><br/>LINE 1216:<br/>search and change following line:<br/>#if (LIBSSH2_APINO > 200503221619)<br/><br/>to:<br/>#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) &#124;&#124; (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)<br/><br/><br/>3. 开始编译<br/>phpize<br/>./configure --with-ssh2<br/>make<br/><br/>4. 加入ssh2扩展到php<br/>cp modules/ssh2.so /usr/lib/php/modules<br/>注意64位系统上是 /usr/lib64<br/><br/>vi php.ini<br/>加入extension=ssh2.so<br/><br/>5. 确认是否已加载<br/>php -i&#124;grep ssh2<br/><br/>结果应该如下所示<br/># php -i&#124;grep ssh2<br/>Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp<br/>ssh2<br/>libssh2 version => 0.17<br/>banner => SSH-2.0-libssh2_0.17<br/>PWD => /root/ssh2-0.10<br/>_SERVER["PWD"] => /root/ssh2-0.10<br/>_ENV["PWD"] => /root/ssh2-0.10 <br/><br/><br/><br/>参看：http://blog.sina.com.cn/s/blog_5ca0ed610100az0t.html<br/>http://www.blabla.cn/z/php_cn/ref.ssh2.html<br/><br/>小提示：<br/>有时服务器忙碌，或者一个连接出错，缓冲区没有数据，PHP脚本就会停止从一个命令输出（即使命令并没有完成！）中收集数据。你可以为此进行如下的操作：<br/>ssh2_exec（$con， ‘ls -al; echo “__COMMAND_FINISHED__”’ ）;<br/>现在，在你不断地检查缓冲区的循环中，只需要看一下COMMAND_FINISHED。因为你就可以知道你拥有了所有的数据。为了避免无限循环（死循环），可以用一个10秒的超时限制：<br/>$time_start = time（）;<br/>$data = “”;<br/>while（ true ）&#123;$data 。= fread（$stream， 4096）;<br/>if（strpos（$data，“__COMMAND_FINISHED__”） ！== false）&#123;<br/>echo “okay： command finished&#92;n”;<br/>break;<br/>&#125;<br/>if（ （time（）-$time_start） 》 10 ）&#123;<br/>echo “fail： timeout of 10 seconds has been reached&#92;n”;<br/>break;<br/>&#125;<br/>&#125;<br/>在上面的例子中，你最好将stream_set_blocking设为false。<br/>通过SSH发送文件<br/>ssh2_scp_send（$con， “/tmp/source.dat”， “/tmp/dest.dat”， 0644）;<br/>如果不能正常工作<br/>请检查如下的几个方面：<br/>依照本文检查你操作的每一步<br/>在服务器端，在sshd_config 中必须启用“PasswordAuthentication yes”。在大多数服务器上默认值是yes，不过有些情况下，你可能需要将下面的一行加入到文件中，即亲自动手打开这个功能：<br/>/etc/ssh/sshd_config：<br/># Change to yes to enable tunnelled clear text<br/>passwordsPasswordAuthentication yes<br/>如果作了改变，就需要重新启动SSH：<br/>/etc/init.d/ssh restart<br/><br/>文章来自学IT网：http://www.xueit.com/php/show-5844-2.aspx
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 让PHP支持SSH/SSH2]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>