一 用PHP提供的專門函數,簡單執行命令
原型:
string system (string command [, int return_var]);string exec(string command [, array $output [, int $return_var]]);
void passthru (string command [, int return_var]);
不同點:
system() 輸出並返回最後一行shell結果。exec() 不輸出結果,返回最後一行shell結果,所有結果可以保存到一個返回的數組裏面。
passthru() 只調用命令,把命令的運行結果原樣地直接輸出到標準輸出設備上。
相同點:
都可以獲得命令執行的狀態碼前提條件:
由於PHP基本是用於WEB程序開發的,所以安全性成了人們考慮的一個重要方面。於是PHP的設計者們給PHP加了一個門:安全模式。如果運行在安全模式下,那麼PHP腳本中將受到如下四個方面的限制:1) 執行外部命令
2) 在打開文件時有些限制
3) 連接MySQL數據庫
4) 基於HTTP的認證
在 安全模式下,只有在特定目錄中的外部程序纔可以被執行,對其它程序的調用將被拒絕。這個目錄可以在php.ini文件中用 safe_mode_exec_dir指令,或在編譯PHP是加上--with-exec-dir選項來指定,默認是 /usr/local/php/bin。
在/etc/php.ini文件中
把safe_mode_exec_dir=
改爲
safe_mode_exec_dir = "/wwwroot/blog/protected/commands/shell"
二 用popen()函數打開進程,實現命令交互
如在增加Linux的系統用戶時,要調用su來把當前用戶換到root纔行,而su命令必須要在命令行上輸入root的密碼。如下(root密碼是root):<?php
$sucmd = "su --login root --command";
$useraddcmd = "useradd ";
$rootpasswd = "root";
$user = "wzhwho";
$useraddcmd = sprintf("%s "%s %s"",$sucmd,$useraddcmd,$user);
$fp = @popen($useraddcmd,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
?>
三 示例
C程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int a = 0;
int r =0;
if(argc != 2)
{
printf("usage: %s &r\n", argv[0]);
exit(-1);
}
a = atoi(argv[1]);
r = a*a;
printf("Ok:r = %d\n",r);
return r;
}
php程序
<html>
<body>
<h1>Call External Program</h1>
<?php
$p=3;
$ret = -1;
$r =-1;
echo "=====system========";
echo "<br />";
$r=system("whoami",$ret);
echo "<br />";
echo "r is $r,ret is $ret";
echo "<br />";
echo "=====exec========";
$r=exec("whoami",$ret);
echo "<br />";
echo "r is $r,ret is $ret";
echo "<br />";
echo "=======passthru======";
echo "<br />";
passthru("whoami", $ret);
echo "<br />";
echo "r is $r,ret is $ret";
?>
</body>
</html>
輸出結果:
=====system========
apacher is apache,ret is 0
=====exec========
r is apache,ret is Array
=======passthru======
apache
r is apache,ret is 0