SSH可以通过将联机
![](/icons/54655de.gif)
封包加密
![](/icons/54655de.gif)
技术进行资料
![](/icons/54655de.gif)
传递;使用SSH可以把传输
![](/icons/54655de.gif)
所有数据进行加密
![](/icons/54655dou.gif)
即使有人截获到数据也无法得到有用
![](/icons/54655de.gif)
信息……
SSH可以通过将联机
![](/icons/54655de.gif)
封包加密
![](/icons/54655de.gif)
技术进行资料
![](/icons/54655de.gif)
传递;使用SSH可以把传输
![](/icons/54655de.gif)
所有数据进行加密
![](/icons/54655dou.gif)
即使有人截获到数据也无法得到有用
![](/icons/54655de.gif)
信息
![](/icons/54655dou2.gif)
同时数据经过压缩
![](/icons/54655dou.gif)
大大地加快了传输
![](/icons/54655de.gif)
速度
![](/icons/54655dou2.gif)
总的
![](/icons/54655dou.gif)
通过SSH
![](/icons/54655de.gif)
使用
![](/icons/54655dou.gif)
可以确保资料传输比较安全并且传输效率较高
不过
![](/icons/54655dou.gif)
并非所有人知道PHP可以和SSH连接
![](/icons/54655de.gif)
特性以及和执行远程命令
![](/icons/54655de.gif)
能力
![](/icons/54655dou.gif)
不过这方面却非常有用
![](/icons/54655dou2.gif)
由于我们可以在很多区别
![](/icons/54655de.gif)
方面利用PHP
![](/icons/54655dou.gif)
因此它有很多设置选项来控制其行为
![](/icons/54655dou2.gif)
![](/icons/54655yi.gif)
组庞大
![](/icons/54655de.gif)
可选参数能够保证您可以将PHP用于许多区别
![](/icons/54655de.gif)
目
![](/icons/54655de.gif)
![](/icons/54655dou.gif)
但这同时也意味着这些参数和服务端配置
![](/icons/54655de.gif)
组合会带来
![](/icons/54655yi.gif)
些安全问题
![](/icons/54655dou2.gif)
笔者
![](/icons/54655yi.gif)
直在PHPCLI应用
![](/icons/54655chengxu.gif)
中使用SSH
![](/icons/54655dou.gif)
笔者是从cronjobs中使用它
![](/icons/54655de.gif)
![](/icons/54655dou.gif)
不过
![](/icons/54655yi.gif)
开始并非十分简单
![](/icons/54655dou.gif)
可以说颇费周折
![](/icons/54655dou2.gif)
有关安全使用Shell2
![](/icons/54655hanshu.gif)
![](/icons/54655de.gif)
手册也不是十分实用
![](/icons/54655dou.gif)
笔者进行了多次试验的后才有了今天这篇小文章
![](/icons/54655dou.gif)
愿您读了的后能为您配置PHP节省
![](/icons/54655yi.gif)
点儿时间
在这篇文章中
![](/icons/54655dou.gif)
笔者需要假设:
你正在运行
![](/icons/54655de.gif)
操作系统是Debian/Ubuntu
![](/icons/54655dou2.gif)
如果你运行
![](/icons/54655de.gif)
不是Debian/Ubuntu
![](/icons/54655dou.gif)
你可能需要用你
![](/icons/54655de.gif)
Linux发行版本提供
![](/icons/54655de.gif)
数据包管理器来替换本文对应内容
你运行
![](/icons/54655de.gif)
是PHP5.如果你运行
![](/icons/54655de.gif)
不是PHP5,可用PHP4代替的
你对PHP和服务器管理有基本
![](/icons/54655de.gif)
了解
你已经安装了PHP
先决条件
安装
![](/icons/54655chengxu.gif)
包
首先
![](/icons/54655dou.gif)
让我们安装下面
![](/icons/54655de.gif)
![](/icons/54655chengxu.gif)
包:
sudoaptitudeupdate sudoaptitude
![](/icons/54655install.gif)
php5-devphp5-cliphp-pearbuid-essential\\ openssl-devzlib1g-dev
安装完成进入下
![](/icons/54655yi.gif)
步
编译libssh2
在从sourceforge网站WebSite下载了Libssh2的后
![](/icons/54655dou.gif)
我们需要编译它
![](/icons/54655dou.gif)
不过不要担心
![](/icons/54655dou.gif)
你只需要按照如下
![](/icons/54655de.gif)
思路方法操作:
cd/usr/src wgetsurfnet.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.14.tar.gz tar-zxvflibssh2-0.14.tar.gz cdlibssh2-0.14/ ./configure makeall
如果你想检查是否有了
![](/icons/54655yi.gif)
个新版本
![](/icons/54655dou.gif)
可以查看SF.NET.不过
![](/icons/54655dou.gif)
0.14这个版本就足够了
安装
安装ssh2.so
下
![](/icons/54655yi.gif)
步
![](/icons/54655dou.gif)
我们需要将libssh和PHPr链接起来
![](/icons/54655dou2.gif)
有
![](/icons/54655yi.gif)
个PECL模块可以完成这个功能
![](/icons/54655dou2.gif)
我们可以使用PEAR安装它
pear
![](/icons/54655install.gif)
-fssh2
-f参数确保SSH2被安装
![](/icons/54655dou.gif)
即使并没有
![](/icons/54655yi.gif)
个稳定
![](/icons/54655de.gif)
选择对象
![](/icons/54655dou2.gif)
你还可以使用如下
![](/icons/54655de.gif)
包名称:ssh2-beta来强行运行
现在你需要确保我们这个新
![](/icons/54655de.gif)
SSH2.SO模块被PHP加载
![](/icons/54655dou2.gif)
编辑你
![](/icons/54655de.gif)
php.ini文件
(对于CLI实用
![](/icons/54655chengxu.gif)
:/etc/php5/cli/php.ini
![](/icons/54655dou.gif)
对于Apache实用
![](/icons/54655chengxu.gif)
:/etc/php5/apache2/php.ini)
extension=ssh2.so
这应该放在“DynamicExtensions”
![](/icons/54655de.gif)
下面
![](/icons/54655dou.gif)
大约在第515行左右
PHP支持SSH编写代码
你刚刚在PHP中启用了SSH2
![](/icons/54655dou2.gif)
那么现在应该如何利用它呢?有两个选择
![](/icons/54655dou2.gif)
SSH支持: [Page]
1.执行思路方法:
这告诉你
![](/icons/54655de.gif)
服务器
![](/icons/54655de.gif)
操作系统来执行什么东西
![](/icons/54655dou.gif)
并且通过管道传回到你
![](/icons/54655de.gif)
脚本
2.外壳思路方法:
这种思路方法在操作系统中打开
![](/icons/54655yi.gif)
个实际
![](/icons/54655de.gif)
外壳
![](/icons/54655dou.gif)
这正像通过终端应用
![](/icons/54655chengxu.gif)
登录时所操作
![](/icons/54655de.gif)
那样
![](/icons/54655dou2.gif)
有
![](/icons/54655yi.gif)
些路由器并没有
![](/icons/54655yi.gif)
个完全
![](/icons/54655de.gif)
POSIX
![](/icons/54655yi.gif)
致性实施过程
![](/icons/54655dou.gif)
而是在你登录时立即运行其自身
![](/icons/54655de.gif)
应用
![](/icons/54655chengxu.gif)
![](/icons/54655dou2.gif)
这时你就需要这种思路方法
下面我们分别详述的:
第
![](/icons/54655yi.gif)
种思路方法:执行
你最好为下面
![](/icons/54655de.gif)
代码创建
![](/icons/54655hanshu.gif)
或者是
![](/icons/54655yi.gif)
个类
![](/icons/54655dou.gif)
不过本文仅仅起到
![](/icons/54655yi.gif)
个为您提供基本观念
![](/icons/54655de.gif)
作用
![](/icons/54655dou.gif)
所以说你可以如此开始:
![](/icons/54655if.gif)
(!function_exists(\"ssh2_connect\"))die(\"functionssh2_connectdoesn’texist\") //loginatserver1.example.comonport22
![](/icons/54655if.gif)
(!($con=ssh2_connect(\"server1.example.com\",22)))
{ echo\"fail:unabletoestablishconnection\\n\"; }
![](/icons/54655else.gif)
{ //trytoauthenticatewithusernameroot,passwordsecretpassword
![](/icons/54655if.gif)
(!ssh2_auth_password($con,\"root\",\"secretpassword\")){ echo\"fail:unabletoauthenticate\\n\"; }
![](/icons/54655else.gif)
{ //allright,we’rein! echo\"okay:loggedin...\\n\"; //executeacommand
![](/icons/54655if.gif)
(!($stream=ssh2_exec($con,\"ls-al\"))){ echo\"fail:unabletoexecutecommand\\n\"; }
![](/icons/54655else.gif)
{ //collect
![](/icons/54655return.gif)
ingdatafromcommand stream_
![](/icons/54655set.gif)
_blocking($stream,true); $data=\"\"; while($buf=fread($stream,4096)){ $data.=$buf; } fclose($stream); } }
第 2种思路方法:外壳
同样道理
![](/icons/54655dou.gif)
你也可以为如下
![](/icons/54655de.gif)
代码编写
![](/icons/54655hanshu.gif)
或者
![](/icons/54655yi.gif)
个类
![](/icons/54655dou2.gif)
不过
![](/icons/54655dou.gif)
本文仅仅提供基本观念:
![](/icons/54655if.gif)
(!function_exists(\"ssh2_connect\"))die(\"functionssh2_connectdoesn’texist\") //loginatserver1.example.comonport22
![](/icons/54655if.gif)
(!($con=ssh2_connect(\"server1.example.com\",22))){ echo\"fail:unabletoestablishconnection\\n\"; }
![](/icons/54655else.gif)
{ //trytoauthenticatewithusernameroot,passwordsecretpassword
![](/icons/54655if.gif)
(!ssh2_auth_password($con,\"root\",\"secretpassword\")){ echo\"fail:unabletoauthenticate\\n\"; }
![](/icons/54655else.gif)
{ //allright,we’rein! echo\"okay:loggedin...\\n\"; //createashell [Page]
![](/icons/54655if.gif)
(!($shell=ssh2_shell($con,’vt102’,null,80,40,SSH2_TERM_UNIT_CHARS))){ echo\"fail:unabletoestablishshell\\n\"; }
![](/icons/54655else.gif)
{ stream_
![](/icons/54655set.gif)
_blocking($shell,true); //sendacommand fwrite($shell,\"ls-al\\n\"); sleep(1); //&collect
![](/icons/54655return.gif)
ingdata $data=\"\";
while($buf=fread($shell,,4096)){ $data.=$buf; } fclose($shell); } } }
小提示:
有时服务器忙碌
![](/icons/54655dou.gif)
或者
![](/icons/54655yi.gif)
个连接出错
![](/icons/54655dou.gif)
缓冲区没有数据
![](/icons/54655dou.gif)
PHP脚本就会停止从
![](/icons/54655yi.gif)
个命令输出(即使命令并没有完成!)中收集数据
![](/icons/54655dou2.gif)
你可以为此进行如下
![](/icons/54655de.gif)
操作:
ssh2_exec($con,’ls-al;echo\"__COMMAND_FINISHED__\"’);
现在
![](/icons/54655dou.gif)
在你不断地检查缓冲区
![](/icons/54655de.gif)
循环中
![](/icons/54655dou.gif)
只需要看
![](/icons/54655yi.gif)
下COMMAND_FINISHED
![](/icons/54655dou2.gif)
![](/icons/54655yinwei.gif)
你就可以知道你拥有了所有
![](/icons/54655de.gif)
数据
![](/icons/54655dou2.gif)
为了避免无限循环(死循环)
![](/icons/54655dou.gif)
可以用
![](/icons/54655yi.gif)
个10秒
![](/icons/54655de.gif)
超时限制:
$time_start=time
![](/icons/54655kh.gif)
; $data=\"\"; while(true){ $data.=fread($stream,4096);
![](/icons/54655if.gif)
(strpos($data,\"__COMMAND_FINISHED__\")!
![](/icons/54655dd.gif)
false){ echo\"okay:commandfinished\\n\";
![](/icons/54655break.gif)
; }
![](/icons/54655if.gif)
((time
![](/icons/54655kh.gif)
-$time_start)>10){ echo\"fail:timeoutof10secondshasbeenreached\\n\";
![](/icons/54655break.gif)
; } }
在上面
![](/icons/54655de.gif)
例子中
![](/icons/54655dou.gif)
你最好将stream_
![](/icons/54655set.gif)
_blocking设为false
通过SSH发送文件
ssh2_scp_send($con,\"/tmp/source.dat\",\"/tmp/dest.dat\",0644);
如果不能正常工作
请检查如下
![](/icons/54655de.gif)
几个方面:
依照本文检查你操作
![](/icons/54655de.gif)
每
![](/icons/54655yi.gif)
步
在服务器端
![](/icons/54655dou.gif)
在sshd_config中必须启用“PasswordAuthenticationyes”
![](/icons/54655dou2.gif)
在大多数服务器上默认值是yes
![](/icons/54655dou.gif)
不过有些情况下
![](/icons/54655dou.gif)
你可能需要将下面
![](/icons/54655de.gif)
![](/icons/54655yi.gif)
行加入到文件中
![](/icons/54655dou.gif)
即亲自动手打开这个功能:
/etc/ssh/sshd_config: #Changetoyestoenabletunnelledcleartextpasswords PasswordAuthenticationyes
如果作了改变
![](/icons/54655dou.gif)
就需要重新启动SSH:
/etc/init.d/sshrestart