在PHP中执行shell脚本

时间:2011-10-13 08:25:29

标签: php linux shell command-line

当我们安装程序(例如DBMS)时,它可以由shell命令本地运行;但是为了在PHP,Perl,Python等中运行它,我们需要适当的API /驱动程序。这可能会减慢过程并增加新的限制(例如,CBD不需要适合内存,但在Perl中需要使用CDB_File)。

问题1: shell是运行程序的最快和最佳位置(无论我们的应用程序和目的如何)。

在PHP中使用exec()或shell_exec()执行ssh命令是很常见的。但这种情况很少发生。

问题2:定期将php代码与shell命令混合是否方便?创建一个长shell脚本,然后在exec(“./ shell.sh”)中在php中运行它。这类Web脚本是否存在任何安全问题或问题?

问题3: PHP(和其他脚本语言)本身运行一个shell命令来执行一个过程(例如,读取文件或连接到数据库)。对?因此,shell命令是不可避免的通过php或直接命令?

2 个答案:

答案 0 :(得分:2)

  

问题1: shell是运行程序的最快和最佳位置(无论我们的应用程序和目的如何)。

这取决于该程序的命令行界面是否是与该程序交互的最快方式,以及该程序的CLI接口是否是运行该程序的最佳方式。所以这取决于该计划。例如。您可以通过shell执行Firefox Web浏览器,但它不是最好的使用它。

  

问题2:定期将php代码与shell命令混合是否方便[原文如此!]创建一个长shell脚本,然后在exec(“./ shell.sh”)中在php中运行它。这类Web脚本是否存在任何安全问题或问题?

什么方便与否取决于用户对定期使用shell命令的看法。当然,因为在计算机上运行的所有内容都具有安全隐患,因此对于shell脚本也是如此。

答案 1 :(得分:2)

除了hakre的评论......

  

在PHP中使用exec()或shell_exec()执行ssh命令是很常见的。但这种情况很少见。

除了2个句子中明显的矛盾之外,通过exec / shell_exec调用ssh是一个非常愚蠢的想法。作为一个快速入侵,您知道密钥对身份验证到位,然后它将解决问题 - 但对于更一般的应用程序,您应该使用proc_open以便在相关流上使用正确的握手 - 或ssh2 extension

关于q3,没有。在PHP提供函数的地方,几乎不可避免地它将被当前进程/线程实现为本机函数调用(我唯一知道的是POSIX系统上的mail()命令)。使用exec,shell_exec,passthru,popen等等,必须创建一个新进程。

关于安全性......因为网络服务器(及其脚本)运行单个uid,除了用户的权限和ulimit(例如base_opendir)之外,通常还存在对访问的附加约束 - 但这些约束不适用于单独的过程。因此,当您启动新流程时,将上下文交叉到不同的安全模型中。