开发学院WEB开发PHP php中调用外部命令函数system,exec,passthru,esca... 阅读

php中调用外部命令函数system,exec,passthru,escapeshellcmd,shell_exec区别与用法

 2010-10-07 17:04:58 来源:WEB开发网   
核心提示:php给我们提供了system(),exec(),php中调用外部命令函数system,exec,passthru,escapeshellcmd,shell_exec区别与用法,passthru(),shell_exec()这几个函数来调用外部的命令.虽然这几个命令都能执行linux系统的shell命令,可以防止使用者

php给我们提供了system(),exec(),passthru(),shell_exec()这几个函数来调用外部的命令.虽然这几个命令都能执行linux系统的shell命令,但是其实他们是有区别的:

system() 输出并返回最后一行shell结果。

exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。

passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。

相同点:都可以获得命令执行的状态码

escapeshellcmd() 则是除去字符串中的特殊符号。可以防止使用者耍花招来破解该服务器系统。

system()
原型:string system (string command [, int return_var])
system()函数和其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
例子:
1
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");
2
exec("/bin/ls -l", $res);
3
exec("/bin/ls -l", $res, $rc);

passthru()
原型:void passthru (string command [, int return_var])
passthru ()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus (Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
例子:
view sourceprint?
1
header("Content-type: image/gif");
2
passthru("./ppmtogif hunte.ppm");

shell_exec()
原型:string shell_exec (string $cmd )

shell_exec() 命令行实际上仅是反撇号 (`) 操作符的变体。如果您编写过 shell 或 Perl 脚本,您就知道可以在反撇号操作符内部捕捉其他命令的输出。例如,清单 1 显示了如何使用反撇号在当前目录中获取每个文本(.txt)的单词计数。

PHP命令行概述

清单 1. 使用反撇号计算单词数量

#! /bin/sh 
number_of_words=`wc -w *.txt` 
echo $number_of_words 
 
#result would be something like: 
#165 readme.txt 388 results.txt 588 summary.txt 
#and so on.... 
在您的 PHP 脚本中,您可以在 shell_exec() 中运行这个简单的命令,如清单 2 所示,并获取想要的结果。这里假设在同一个目录下有一些文本文件。

清单 2. 在 shell_exec() 中运行相同的命令

<?php
$results = shell_exec('wc -w *.txt'); 
echo $results; 
?>
注意,仅使用后撇号操作符也会得到相同的结果,如下所示。

清单 3. 仅使用后撇号操作符

<?php
$results = `wc -w *.txt`; 
echo $results; 
?>
清单 4. 更加简单的方法

<?php
echo `wc -w *.txt`; 
?>
通过 UNIX 命令行和 shell 脚本能够完成很多东西,知道这点很重要。例如,您可以使用竖线将命令连接起来。您甚至可以使用操作符在其中创建 shell 脚本,并且仅调用 shell 脚本(根据需要使用或不使用参数)。例如,如果您仅希望计算该目录下的前 5 个文本文件的单词数,那么可以使用竖线 (|) 将 wc 和 head 命令连接起来。另外,您还可以将输出结果放到 pre 标记内部,让它能够更美观地呈现在 Web 浏览器中,如下所示。

清单 5. 更加复杂的 shell 命令

<?php
$results = shell_exec('wc -w *.txt | head -5'); 
echo "<pre>".$results . "</pre>"; 
?>

scapeshellcmd()
原型:string escapeshellcmd(string command)
本函数除去了字符串中的特殊符号,可以防止使用者耍花招来破解该服务器系统。可以用本函数搭配 exec() 或是 system() 二个函数,酱子可以减少网络上的使用者恶意的破晃募?机会。

使用范例
<?php
system(EscapeShellCmd($cmdline));
?>

Tags:system exec passthru escapeshellcmd shell_exec

编辑录入:coldstar [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
更多精彩
    赞助商链接

    热点阅读
      焦点图片
        最新推荐
          精彩阅读