仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3032|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网站制作之用SSH与PHP相毗连 确保数据传输的平安性...

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:51:24 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
掌握静态网页的制作技术是学习开发网站的先决条件,这一点就讲到这里,因为这篇文章不是教程文章,也就不对技术进行深入的刨析了。SSH可以经由过程将联机的封包加密的手艺停止材料的传递; 利用SSH可以把传输的一切数据停止加密,即便有人截获到数据也没法失掉有效的信息。同时数据经由紧缩,大大地加速了传输的速度。总之,经由过程SSH的利用,可以确保材料传输对照平安而且传输效力较高。   不外,并不是一切人晓得PHP可以与SSH毗连的特征和与履行近程号令的才能,不外这方面却十分有效。因为咱们可以在良多分歧的方面使用PHP,因而它有良多设置选项来掌握其行动。一组复杂的可选参数可以包管您可以将 PHP 用于很多分歧的目标,但这同时也意味着这些参数和办事端设置装备摆设的组合会带来一些平安成绩。笔者一向在PHP CLI使用法式中利用SSH,笔者是从cronjobs中利用它的,不外一入手下手并不是非常复杂,可以说颇费周折。关于平安利用Shell2 函数的手册也不是非常适用,笔者停止了屡次实验以后才有了明天这篇小文章,愿您读了以后能为您设置装备摆设PHP节俭一点儿工夫。
在这篇文章中,笔者需求假定:
你正在运转的操作体系是Debian / Ubuntu。假如你运转的不是Debian / Ubuntu,你能够需求用你的Linux刊行版本供应的数据保证理器来交换本文对应内容。
你运转的是PHP5.假如你运转的不是PHP5,可用PHP4取代之。
你对PHP和办事器办理有根基的懂得。
你已装置了PHP。
先决前提
装置法式包
起首,让咱们装置上面的法式包:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential \
openssl-dev zlib1g-dev
装置完成进入下一步。
编译libssh2
在从sourceforge网站下载了Libssh2以后,咱们需求编译它,不外不要忧虑,你只需求依照以下的办法操作:
cd /usr/src
wget surfnet.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.14.tar.gz
tar -zxvf libssh2-0.14.tar.gz
cd libssh2-0.14/
。/configure
make all install
假如你想反省是不是有了一个新版本,可以检查SF.NET.不外,0.14这个版本就足够了。
装置
装置ssh2.so
下一步,咱们需求将libssh和 PHPr链接起来。有一个PECL模块可以完成这个功效。咱们可使用PEAR装置它。
pear install -f ssh2
-f参数确保SSH2被装置,即便并没有一个不乱的选择对象。你还可使用以下的包称号:ssh2-beta来强交运行。
如今你需求确保咱们这个新的SSH2.SO模块被PHP加载。编纂你的php.ini文件(关于CLI适用法式:/etc/php5/cli/php.ini,关于Apache适用法式:/etc/php5/apache2/php.ini)
extension=ssh2.so
这应当放在“Dynamic Extensions”的上面,大约在第515行摆布。
PHP撑持SSH编写代码
你方才在PHP中启用了SSH2。那末如今应当若何使用它呢?有两个选择。SSH撑持:
1.履行办法:
这告知你的办事器的操作体系来履行甚么器材,而且经由过程管道传回到你的剧本。
2.外壳办法:
这类办法在操作体系中翻开一个实践的外壳,这正像经由过程终端使用法式登录时所操作的那样。有一些路由器并没有一个完整的POSIX分歧性实行进程,而是在你登录时当即运转其本身的使用法式。这时候你就需求这类办法。
上面咱们分离胪陈之:
第一种办法:履行
你最好为上面的代码创立函数或是一个类,不外本文仅仅起到一个为您供应根基不雅念的感化,所以说你可以如斯入手下手:
if (!function_exists(“ssh2_connect”)) die(“function ssh2_connect doesn‘t exist”)
// log in at server1.example.com on port 22
if(!($con = ssh2_connect(“server1.example.com”, 22))){
echo “fail: unable to establish connection\n”;
}
else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con, “root”, “secretpassword”)) {
echo “fail: unable to authenticate\n”;
}
else {
// allright, we’re in!
echo “okay: logged in.。.\n”;
// execute a command
if(!($stream = ssh2_exec($con, “ls -al” )) ){
echo “fail: unable to execute command\n”;
}
else{
// collect returning data from command
stream_set_blocking( $stream, true );
$data = “”;
while( $buf = fread($stream,4096) ){$data 。= $buf;
}
fclose($stream);
}
}
第二种办法:外壳
一样事理,你也能够为以下的代码编写函数或一个类。不外,本文仅仅供应根基不雅念:
if (!function_exists(“ssh2_connect”)) die(“function ssh2_connect doesn‘t exist”)
// log in at server1.example.com on port 22
if(!($con = ssh2_connect(“server1.example.com”, 22))){
echo “fail: unable to establish connection\n”;
}
else {
// try to authenticate with username root, password secretpassword
if(!ssh2_auth_password($con, “root”, “secretpassword”)) {
echo “fail: unable to authenticate\n”;
}
else {
// allright, we’re in!echo “okay: logged in.。.\n”;
// create a shell
if(!($shell = ssh2_shell($con, ‘vt102’, null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo “fail: unable to establish shell\n”;
}
else{
stream_set_blocking( $shell, true );
// send a commandfwrite($shell,“ls -al\n”);
sleep(1);
// & collect returning data$data = “”;
while( $buf = fread($shell,,4096) ){
$data 。= $buf;
}
fclose($shell);
}
}
}
小提醒:
有时办事器劳碌,或一个毗连失足,缓冲区没无数据,PHP剧本就会中断从一个号令输入(即便号令并没有完成!)中搜集数据。你可觉得此停止以下的操作:
ssh2_exec($con, ‘ls -al; echo “__COMMAND_FINISHED__”’ );
如今,在你不休地反省缓冲区的轮回中,只需求看一下COMMAND_FINISHED。由于你就能够晓得你具有了一切的数据。为了不无穷轮回(逝世轮回),可以用一个10秒的超时限制:
$time_start = time();
$data = “”;
while( true ){$data 。= fread($stream, 4096);
if(strpos($data,“__COMMAND_FINISHED__”) !== false){
echo “okay: command finished\n”;
break;
}
if( (time()-$time_start) 》 10 ){
echo “fail: timeout of 10 seconds has been reached\n”;
break;
}
}
在下面的例子中,你最好将stream_set_blocking设为false。
经由过程SSH发送文件
ssh2_scp_send($con, “/tmp/source.dat”, “/tmp/dest.dat”, 0644);
假如不克不及正常任务
请反省以下的几个方面:
按照本文反省你操作的每步
在办事器端,在sshd_config 中必需启用“PasswordAuthentication yes”。在大多半办事器上默许值是yes,不外有些情形下,你能够需求将上面的一行到场到文件中,即亲身下手翻开这个功效:
/etc/ssh/sshd_config:
# Change to yes to enable tunnelled clear text
passwordsPasswordAuthentication yes
假如作了改动,就需求从头启动SSH:
/etc/init.d/ssh restart
在这里想谈谈自己这六个多月的PHP学习心得,希望对给比我还新的新手们有所帮助,讲的不是很深刻,甚至有的想法可能是错误的,希望不要误导新人才好,大家要有自己的主见。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 05:07

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表