转自:http://www.kuqin.com/linux/20090417/46471.html
首先先要给大家介绍PHP执行linux系统命令的几个基本函数。我曾经很长一段时间都分不清下面几个函数的具体用法区别。
system函数
说明:执行外部程序并显示输出资料。
语法:string system(string command, int [return_var]);
返回值: 字符串
详细介绍:
本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中。同样值得注意的是若需要处理用户输入的资料,而又要防止用户耍花招破解系统,则可以使用 EscapeShellCmd()。若 PHP 以模块式的执行,本函数会在每一行输出后自动更新 Web 服务器的输出缓冲暂存区。若需要完整的返回字符串,且不想经过不必要的其它中间的输出界面,可以使用 PassThru()。
实例代码:
$last_line = system("ls", $retval);
echo "Last line of the output: " . $last_line;
echo "<hr />Return value: " . $retval;
?>
exec函数
说明:执行外部程序。
语法:string exec(string command, string [array], int [return_var]);
返回值: 字符串
详细介绍:
本函数执行输入 command 的外部程序或外部指令。它的返回字符串只是外部程序执行后返回的最后一行;若需要完整的返回字符串,可以使用 PassThru() 这个函数。
要是参数 array 存在,command 会将 array 加到参数中执行,若不欲 array 被处理,可以在执行 exec() 之前呼叫 unset()。若是 return_var 跟 array 二个参数都存在,则执行 command 之后的状态会填入 return_var 中。
值得注意的是若需要处理使用者输入的资料,而又要防止使用者耍花招破解系统,则可以使用 EscapeShellCmd()。
实例代码:
echo exec("whoami");
?>
popen函数
说明:打开文件。
语法:int popen(string command, string mode);
返回值: 整数
详细介绍:
本函数执行指令开档,而该文件是用管道方式处理的文件。用本函数打开的文件只能是单向的 (只能读或只能写),而且一定要用 pclose() 关闭。在文件操作上可使用 fgets()、fgetss() 与 fputs()。若是开档发生错误,返回 false 值。
实例代码:
$fp = popen( "/bin/ls", "r" );
?>
1.
<?php
echo shell_exec("id -a");
$last_line = system("/usr/sbin/phpsystem /bin/date -s '2010-05-28 13:10'", $retval);
echo 'Last line of the output: ' . $last_line;
echo '<hr />Return value: ' . $retval;
?>
//
2.在/usr/local/apache2/htdocs/asterisk/目录下建立文件phpsystem.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
uid_t uid ,euid;
int id;
uid = getuid() ;
euid = geteuid();
//printf("my uid :%u/n",getuid()); //这里显示的是当前的uid 可以注释掉.
//printf("my euid :%u/n",geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
{
perror("setreuid");
}
//printf("/n/nafter setreuid uid :%u/n",getuid());
//printf("afer sertreuid euid :%u/n",geteuid());
int i;
char cmd[1024]={0};
for(i=1;i<argc;i++)
{
if(strchr(argv[i],' '))
{
strcat(cmd,"'");
strcat(cmd,argv[i]);
strcat(cmd,"'");
}
else
strcat(cmd,argv[i]);
strcat(cmd," ");
}
printf( "\ncmd is: %s\n",cmd);
id = system(cmd);
//printf( "/nid=%d/n",id );
//id=-1:出现错误
//id=0:调用成功但是没有出现子进程
//id>0:成功退出的子进程的id
return id;
}
///
3. 保存并编译phpsystem.c
#gcc -o phpsystem -Wall phpsystem.c
//
4. 赋权限
#chmod u+s ./phpsystem
//
5. 在浏览器中预览结果
uid=48(apache) gid=48(apache) groups=48(apache) Fri May 28 13:10:00 CST 2010 cmd is: /bin/date -s '2010-05-28 13:10' Last line of the output: cmd is: /bin/date -s '2010-05-28 13:10'
Return value: 0