16.4.7 执行引号和exec

前面,我们简单的介绍过shell命令行执行程序,或者叫“执行引号”。本质上,它是一种语言操作符,通过这个操作符可以在命令行方式下执行任何命令(某些类UNIX操作系统提供的sh或Windows系统下的cmd.exe),而这些被执行的命令需要封闭在反引号()中。请注意,反引号与常规的单引号(')是不同的。通常,该键位于英语键盘的左上方,而在其他键盘布局不是很容易找到。

执行引号将在被执行程序的文本输出中返回一个字符串。如果有一个包含大量名称和电话号码的文本文件,可以使用"grep"命令找到所有名称包含"Smith"的名称。Grep是一个类UNIX命令,它输入参数包括要查询的字符串模式以及要查找的文件。该命令将找到包含与目标模式相匹配的文件行,如下所示:


grep[args]pattern files-to-search…


当然也有Windows版本的grep命令,事实上,Windows系统中包括一个名为findstr.exe的程序,它具有与grep类似的功能。要找到名为"Smith"的用户,可以使用如下所示的PHP脚本:


<?php

//-i means ignore case

$users='grep-i smith/home/httpd/www/phonenums.txt';

//split the output lines into an array

//note that the\n should be\r\n on Windows!

$lines=split($users,"\n");

foreach($lines as$line)

{

//names and phone nums are separated by,char

$namenum=split($lines,',');

echo"Name:{$namenum[0]},Phone#:{$namenum[1]}<br/>\n";

}

?>


如果允许用户输入出现在反引号的命令中,你就将面临各种安全问题,将必须严格的过滤用户输入以确保系统安全。至少,必须使用escapeshellcmd函数。但是,要确保安全,可以考虑限制可能的输入值。更糟糕的是,既然通常都希望能够在较低的用户权限环境下运行Web服务器和PHP(在接下来的内容将介绍这些),我们就必须手工地授予更多的权限来执行某些命令,这样也同样会进一步影响安全性。在产品环境,这个操作符的使用必须要有足够的警惕。

exec和系统函数与执行引号非常类似,不同之处在于它们直接执行命令,而不是在shell环境中执行命令,因此也就不需要必须返回执行引号返回的所有输出。当然,这些命令具有相同的安全问题,因此需要有同等的注意。