了解命令的区别并进行直观的选择
这是一篇翻译文章,原作者通过表格的形式更加直观的展现出差异并进行选择

前言

PHP有众多调用系统命令的函数,大致如下:

  • system()
  • exec()
  • passthru()
  • shell_exec()
  • ``

于是就想着总结一下它们的差异。本想着对照手册把它们的函数功能,参数,返回等都列出来,但是其实不利于直观看出差异来。谷歌上发现大多数人跟我想的一样,更侧重于函数功能的介绍。于是通过stack overflow,终于发现了满意的答案,虽然答案简短但是直观,于是准备翻译一下,原文地址:http://stackoverflow.com/questions/732832/php-exec-vs-system-vs-passthru#answer-39681338

原文翻译

先前的回答看起来有点疑惑、不完整(译注:其他回答通篇文字说明),因此以下表总结了区别:

Command Displays Output Can Get Output Gets Exit Code
system() Yes(text) Last line only Yes
passthru Yes(raw) No Yes
exec No Yes (array) Yes
shell_exec No Yes (string) No
backticks(``) No Yes (string) No
  • 'Displays Output'意味着它将输出流输出到浏览器(或者如果在命令行运行,就在命令行输出)
  • 'Can Get Output'意味着你可以获取到命令的输出并分配给PHP变量
  • 'The "exit code'是一个命令返回的特殊值(也叫做'返回状态'),'0'意味着成功,其他值通常是错误码

其他易混淆的注意事项:

  • shell_exec()和执行操作符(``)功能是一样的
  • 可以使用proc_open()和popen()交互式读/写数据流
  • 如你想要捕获、展示错误信息,命令增加'2>&1'
  • 使用escapeshellcmd()过滤可能包含问题字符的命令的参数
  • 如果exec传入$output变量存储输出,如果$output变量不为空,输出内容将会插入到$output变量中(译注:$output参数是引用传值的)。所以你可能首先要删除($output)。

翻译完。

附加内容:安全性

任何脚本都需要在安全的环境下执行,PHP提供了两个函数来保证执行系统命令的安全。

1.escapeshellcmd()-shell 元字符转义

说明:对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。反斜线()会在以下字符之前插入: #&;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ' 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 都会被空格代替。

2.escapeshellarg()-把字符串转码为可以在 shell 命令里使用的参数

说明:将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。

最新文章

  1. Linux 服务器 安装 memcached
  2. win2003 Enterprise x64 Edtion中的DCOM服务找不到WORD应用程序
  3. 报错com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
  4. etl实现字段值相加
  5. 降低磁盘IO使Oracle性能优化(转)
  6. JS判断是否为IE浏览器 包含了IE11
  7. Ubuntu Vim 复制到系统粘贴板
  8. c#操作sqlite(包含中文支持)
  9. [2017BUAA软工助教]评论汇总
  10. vue 的模板编译—ast(抽象语法树) 详解与实现
  11. 【SSH系列】深入浅出SpringMvc+入门Demo
  12. ArcGIS JS API多线程克里金插值
  13. VIM新手福利,配置向
  14. C++的IO处理中的头文件以及类理解(2)&lt;sstream&gt;头文件
  15. 遇见 TiDB
  16. Centos7下安装docker(1)
  17. 当图片加载失败时更换图片, Firefox onerror 报错
  18. 批量执行命令(SSH)
  19. CSS文字过多显示省略号
  20. javaweb项目中表单生成的验证码以及校验

热门文章

  1. go中变量的使用
  2. Sql Server Management Studio 18 打开闪退问题
  3. elasticsearch Java Client用户指南
  4. 从Flask-Script迁移到Flask-Cli
  5. 第6篇如何访问pod
  6. mysql 存储引擎介绍2
  7. 巨好看的xshell配色
  8. 使用KEIL C51实现的简单合作式多任务操作系统内核(单片机实现版本)
  9. 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
  10. Cisco基础(五):配置静态NAT、配置端口映射、配置动态NAT、PAT配置、办公区Internet的访问