php调用shell的方法

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中调用外界命令,能够用如下两种办法来促成:1)
用PHP提供的特别函数PHP提供共了3个专门的实行外界命令的函数:system(State of Qatar,exec(),passthru(卡塔尔。system(卡塔尔(قطر‎原型:string
system (string command [, int
return_var]State of Qatarsystem(卡塔尔函数很其余语言中的差不离,它实行给定的吩咐,输出和重返结果。第一个参数是可选的,用来收获传令施行后的状态码。例子:system(/usr/local/bin/webalizer/webalizer卡塔尔国;?exec(卡塔尔原型:string
exec (string command [, string array [, int return_var]]State of Qatarexec
(卡塔尔(قطر‎函数与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(State of Qatar函数日常用来调用象pbmplus那样的次序。相同它也得以获得传令推行的状态码。例子:header(Content-type:
image/gif卡塔尔国;passthru(./ppmtogif hunte.ppm卡塔尔(قطر‎;?2)
用popen(卡塔尔函数张开进程方面包车型地铁措施只可以轻松地实施命令,却不能与命令人机联作。但有个别时候必需向命令输入一些事物,如在扩大Linux的连串客商时,要调用su来把当前顾客换来root才行,而su命令必定要在命令行上输入root的密码。这种景况下,用地方提到的点子明显是特别的。popen
(State of Qatar函数展开二个历程管道来实行给定的命令,再次来到七个文件句柄。既然再次来到的是多个文书句柄,那么就足以对它读和写了。在PHP3中,对这种句柄只可以做纯粹的操作情势,要么写,要么读;从PHP4开首,能够並且读和写了。除非这么些句柄是以生龙活虎种方式展开的,不然必得调用pclose(卡塔尔(قطر‎函数来关闭它。例子1:$fp=popen(/bin/ls
-l,<

一、配置

翻开php.ini中安顿是或不是张开安全方式,首假设以下四个地方
safe_mode =  (那几个只要为off上面几个就无须管了卡塔尔
disable_functions = 
safe_mode_exec_dir=

二、使用

是因为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(卡塔尔函数很别的语言中的差相当少,它实践给定的下令,输出和重回结果。第2个参数是可选的,用来得到传令实施后的状态码。
 
例子:
 

复制代码代码如下:

system(“/usr/local/bin/webalizer/webalizer”);

 

 
exec()  
原型:string exec (string command [, string array [, int
return_var]])
 
exec(State of Qatar函数与system(卡塔尔国形似,也试行给定的吩咐,但不出口结果,而是再次来到结果的终极风姿洒脱行。纵然它只回去命令结果的末尾生机勃勃行,但用第贰个参数array能够获得完全的结果,方法是把结果逐行追加到array的结尾处。所以生龙活虎旦array不是空的,在调用从前最棒用unset(State of Qatar最它清掉。独有钦点了第3个参数时,才得以用第多个参数,用来收获命令实施的状态码。
 
例子:
 

复制代码代码如下:

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(State of Qatar函数常常用来调用象pbmplus(Unix
下的一个甩卖图片的工具,输出二进制的本来面目图片的流)那样的顺序。相同它也能够博得命令实施的状态码。
 
例子:
 

复制代码代码如下:

header(“Content-type: image/gif”);
passthru(“./ppmtogif hunte.ppm”);

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注