PHP编程:将SSH与PHP相毗连 确保传输数据的平安
会MYSQL吗?会,我会把我的信息在数据库里插入删除啦 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 http://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 command
fwrite($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秒的超时限制:
以下为援用的内容:
_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 passwords
PasswordAuthentication yes
假如作了改动,就需求从头启动SSH:
/etc/init.d/ssh restart
既然选择了PHP,就要坚持学下去!大家有没有问自己为什么会选择学习PHP呢?就我个人而言,完全是因为兴趣,因为我的专业和计算机完全无关,但是就是对编程很赶兴趣,尤其对网络编程、web开发特别赶兴趣。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ; 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 Ps:以上纯属原创,如有雷同,纯属巧合 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
页:
[1]