php执行系统外部命令的四种方法

  • 来源:
  • 更新日期:2018-04-24

摘要: 出于安全性考虑,在通常情况下虚拟主机、XAMPP、DedeAMPZ等PHP运行环境都是禁止调用系统外部命令的。所以当你需要使用PHP执行命令的函数调用系统外部命令时,你需要确保PHP运行环境支持PHP执行命令的函数。   如果你使用的是XAMPP、DedeAMPZ,一般默认是禁止运行PHP执行命令的函数的,你可以在php.ini配置文件中disable_functions一项中去

准备工作

timg (3).jpg

出于安全性考虑,在通常情况下虚拟主机、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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

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

 

安全性说明

 

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

 

其他说明

 

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

 

leapsoulcn.txt"); ?>

 

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