首页 > 编程语言 >使用PHP执行系统外部命令的四种方法

使用PHP执行系统外部命令的四种方法

时间:2022-10-21 13:37:38浏览次数:76  
标签:执行命令 函数 exec 外部命令 system PHP 四种


准备工作

  出于安全性考虑,在通常情况下虚拟主机、XAMPP、DedeAMPZ等PHP运行环境都是禁止调用系统外部命令的。所以当你需要使用PHP执行命令的函数调用系统外部命令时,你需要确保PHP运行环境支持PHP执行命令的函数。

  如果你使用的是XAMPP、DedeAMPZ,一般默认是禁止运行PHP执行命令的函数的,你可以在php.ini配置文件中disable_functions一项中去除你想要使用的函数,然后重启apache即可。我使用的是DedeAMPZ,所以我去除了exec()、passthru()、system()、shell_exec()这四个函数。​​PHP运行环境如何配置​​?

  如果你的PHP运行环境是自行配置的,默认php.ini配置文件中是不禁止你调用执行外部命令的函数的,当然出于安全考虑,你还是应该禁止调用一部分执行系统外部命令的函数,找到disable_functions,配置如下:

disable_functions = exec,system,passthru,shell_exec

即禁止执行这三个函数,每个函数之间以逗号分隔。​​PHP.INI如何配置​​?

  如果你使用的是虚拟主机,你需要询问主机提供方PHP环境是否支持使用PHP执行命令的函数。

其他说明

  由于我使用的是Windows系统,所以实例教程中以调用windows系统外部命令为主,如你熟悉linux操作,你不妨在linux系统下尝试执行linux命令。

PHP执行命令的四种方法

方法一:使用exec函数执行系统外部命令

原型:function exec(string $command,array[optional] $output,int[optional] $return_value)

<?
​​exec​​ ( "dir" , $outPut ) ;
​​print_r​​ ( $outPut ) ;
?>


说明:列出和PHP执行文件同级目录下的所有目录及文件信息。

知识点:exec执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

方法二:使用system函数执行系统外部命令

原型:function system(string $command,int[optional] $return_value)

<?
​​system​​ ( "dir" ) ;
?>


知识点:system和exec的区别在于system在执行系统外部命令时,直接将结果输出到游览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。

方法三:使用函数passthru执行系统外部命令

原型:function passthru(string $command,int[optional] $return_value)

知识点:passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。

方法四:反撇号`(和~在同一个键)执行系统外部命令

<?
​​echo​​ ` ​​dir​​` ;
?>


知识点:在使用这种方法执行系统外部命令时,你要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。

安全性说明

  当你使用这些函数执行命令时,如果是根据用户提交数据作为执行命令的话,你需要考虑系统安全性,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。

其他说明

  当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出至其他文件,再另行​​读取文件​​,这样可以显著提高程序执行的效率。即

<?
​​system​​ ( "dir > leapsoulcn.txt" ) ;
?>


说明:这里system执行命令时并不将结果直接输出至游览器而是输出至指定目录下的文件中,显著提高了程序执行的效率。

  至此PHP执行命令最常用的四种方法exec()、passthru()、system()、shell_exec()及它们之间的区别就介绍完了,在PHP网站开发中根据情况合理利用这些函数执行系统外部命令是非常有用的。

标签:执行命令,函数,exec,外部命令,system,PHP,四种
From: https://blog.51cto.com/u_5112239/5782461

相关文章

  • Java多线程实现的四种方式
    实现多线程有以下四种方式实现多线程有以下四种方式:1.继承Thread类2.实现Runnable接口3.实现Callable接口4.线程池:提供了一个线程队列,队列中保存着所有等待状态的线程......
  • PHP版web 微信协议模拟登录
    见图:     <?php/***Desc:微信web核心协议实现*/functionarray_to_json($data){$data=json_encode($data,JSON_UNESCAPED_UNICODE);ret......
  • PHP保留两位小数的几种方法
    这篇文章主要介绍了PHP保留两位小数的几种方法,需要的朋友可以参考下 代码如下所示:$num=10.4567;//第一种:利用round()对浮点数进行四舍五入echoround($num,2......
  • js php 简单聊天室
    本文使用websocket+gatewayworker搭的一个简单聊天室,随便写了点样式,大家不要介意哈,主要看流程就好 html代码,<!doctypehtml><htmllang="en"><head><meta......
  • Linux下,PHP添加PDF扩展
    CentOS7中安装在CentOS中可以直接使用Yum进行安装,除了安装ImageMagick,还要安装它的两个依赖ImageMagick-devel和ImageMagick-perl。yum install -y ImageMagick Ima......
  • C++中的四种强制类型转换
    ①static_cast(expression)<type-id>该运算符把expression转换为type_id类型,但没有运行时类型检查来保证转换的安全性,最常用的是基本数据类型之间的转换 ②const_cast......
  • Java四种线程池
    1,线程池的作用 线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果。 2,为什么要用线程池? (1).减少了创建......
  • vue3:vue+nginx+php进行服务端部署的配置(nginx/1.18.0 / [email protected])
    一,开发环境中的配置:1,前端:vue的vue.config.jsconst{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({transpileDependencies:t......
  • ctfshow web136(无回显命令rce+直接修改php源码?!)
    functioncheck($x){if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtou......
  • php根据字符串取得 数字月份函数 php字符串和日期时间转换函数汇总
    <?php$time="2011-1-114:07:14";//字符串类型的日期,很多路径都获取到,如数据库//把字符串类型的日期转换一个时间戳echodate('n',strtotime($time));//1......