PHP在linux上执行系统命令

来源:互联网 发布:林弯弯淘宝店 编辑:程序博客网 时间:2024/06/05 10:17

方法一:用PHP提供的专门函数(四个):
1)exec():

string exec ( string $command [, array &$output [, int &$return_var ] )

说明: exec执行系统外部命令时不会输出结果,而是返回结果的最后一行。如果想得到结果,可以使用第二个参数,让其输出到指定的数组。此数组一个记录代表输出的一行。即如果输出结果有20行,则这个数组就有20条记录,所以如果需要反复输出调用不同系统外部命令的结果,最好在输出每一条系统外部命令结果时清空这个数组unset($output),以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0

<?php    // 输出运行中的 php/httpd 进程的创建者用户名    // (在可以执行 "whoami" 命令的系统上)    echo exec('whoami');?>

2)system():

string system ( string $command [, int &$return_var ] )

说明: system和exec的区别在于,system在执行系统外部命令时,它执行给定的命令,输出和返回结果。成功
则返回命令输出的最后一行, 失败则返回 FALSE。第二个参数是可选的,用来得到命令执行后的状态码。

<?php    $res = system("pwd",$result);    print $result;//输出命令的结果状态码    print $res;//输出命令输出的最后一行?>

关于第二个参数结果状态码的简单介绍:
如果返回0是运行成功
在Bash中,当错误发生在致命信号时,bash会返回128+signal number做为返回值。
如果找不到命令,将会返回127。
如果命令找到了,但该命令是不可执行的,将返回126。
除此以外,Bash本身会返回最後一个指令的返回值。
若是执行中发生错误,将会返回一个非零的值。
Fatal Signal : 128 + signo
Can’t not find command : 127
Can’t not execute : 126
Shell script successfully executed : return the last command exit status
Fatal during execution : return non-zero

3)passthru():

void passthru ( string $command [, int &$return_var ] )

说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。

exec() 函数类似, passthru() 函数 也是用来执行外部命令(command)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
<?php    header("Content-type:image/gif");    passthru("/usr/bin/ppm2tiff  /usr/share/tk8.4/demos/images/teapot.ppm");?>

4)shell_exec():

string shell_exec ( string $cmd )

说明: 直接执行命令$cmd,将完整的命令输出以字符串的方式返回。如果执行过程中发生错误或者进程不产生
输出,则返回 NULL。所以,使用本函数无法通过返回值检测进程是否成功执行。 如果需要检查进程执行的退
出码,请使用 exec() 函数。

<?php    $output = shell_exec('ls -lart');    echo "<pre>$output</pre>";?>

方法二:反撇号:
原型: 反撇号`(和~在同一个键)执行系统外部命令,相当于 shell_exec
说明: 在使用这种方法执行系统外部命令时,要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。

<?php    echo `dir`; ?>

用户自定义输入命令转义:
若命令需要用户输入,此时为了安全应该使用以下方法对用户输入命令或参数进行转义

1、shell 元字符转义

string escapeshellcmd ( string $command )参数说明:command   要转义的命令。返回       转义后的字符串。

除去了字符串中的特殊符号,可以防止使用者耍花招来破解该服务器系统。
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。

反斜线(\)会在以下字符之前插入: #&;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ’ 和 ” 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 都会被空格代替。

实例:

<?php    // 我们故意允许任意数量的参数    $command = './configure '.$_POST['configure_options'];    $escaped_command = escapeshellcmd($command);    system($escaped_command);?>

escapeshellcmd() 应被用在完整的命令字符串上。 即使如此,攻击者还是可以传入任意数量的参数。 请使用 escapeshellarg() 函数 对单个参数进行转义。

2、shell 参数转义

string escapeshellarg ( string $arg )arg :需要被转码的参数。返回值:转换之后字符串。

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符 。
实例:

<?php    system('ls '.escapeshellarg($dir));?>
0 0