PHP教程之PHP中shell脚本的使用方法分享


Posted in PHP onFebruary 23, 2012

作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。

PHP经过长时间的发展,很多用户都很了解PHP了,这里我发表一下个人理解,和大家讨论讨论。大多数情况下,我使用 exec() 命令和数据数组处理所有东西。或者对更简单的命令使用 shell_exec(),尤其是不关心结果时。如果仅需返回一个 PHP shell脚本,我就使用 passthru()。通常,我在不同的场合中使用不同的函数,并且有时它们是可以互换的。

这完全取决于我的心情和要实现的目的。您可能提问的另一个问题是 “它们的长处是什么?”。如果您没有头绪,或者一个项目非常适合使用 shell 命令,但不知道如何使用,那么我在这里提供一些见解。如果您正在编写一个提供各种备份或文件传输功能的应用程序,您可以选择使用 shell_exec() 或这里提供的其他命令之一运行 rsync 支持的 PHP shell脚本。您可以编写 PHP shell脚本使其包含必要的 rsync 命令,然后使用 passthru() 根据用户的命令或 cron 作业执行它。

例如,一位用户在您的应用程序中有适当的权限(比如管理员权限),他想将 50 个 PDF 文件从一个服务器发送到另一个服务器。那么,该用户需要在应用程序中导航到正确的位置,单击 Transfer,选择需要发送的 PDF,然后单击 Submit。在这个过程中,该表单应该有一个 PHP 脚本,它使用返回选项变量通过 passthru() 运行 rsync 脚本,这样您就知道是否发生问题,如下所示。

清单 1. 通过 passthru() 运行 rsync 脚本的示例 PHP 脚本

<?php 
passthru('xfer_rsync.sh',$returnvalue); 
if ($returnvalue != 0){ 
//we have a problem! 
//add error code here 
}else{ 
//we are okay 
//redirect to some other page 
} 
?>

如果您的应用程序需要列出进程或文件,或关于这些进程或文件的数据,您可以使用本文总结的命令之一轻松实现这个目的。例如,一个简单的 grep 命令能够帮助您找到匹配特定搜索条件的文件。将它与 exec() 命令一起使用可以将结果保存到一个数组中,这允许您构建一个 HTML 表或表单,它们又进一步允许您运行其他命令。

到目前为止,我讨论了用户生成的事件 —— 用户只要按下按钮或单击链接,PHP 就运行相应的脚本。您还可以将独立的 PHP 脚本和 cron 或其他日程安排程序一起使用,从而实现一些有趣的效果。例如,如果您一个备份脚本,您可以通过 cron 运行它,或者将它打包到 PHP 脚本后在运行。

为什么要这样做?这似乎是多余的,不是吗?不是这样的 —— 您需要这样考虑,您可以通过 exec() 或 passthru() 运行备份脚本,然后根据返回代码执行一些行为。如果出现错误,您可以将其记录到错误日志或数据库中,或发送一封警告电子邮件。如果脚本成功,您可以将原始的输出转储到数据库(例如,rsync 有一个详尽(verbose)模式,对随后诊断问题十分有用)。

安全

我们在这里简要讨论一下安全性:如果您接受用户输入并将信息传递到 shell,那么最好过滤用户输入。删除您认为有害的命令和不允许的内容,比如 sudo(作为超级用户运行)或 rm(删除)。事实上,您可能不希望用户发送开放的请求,而是让他们从列表中选择。

例如,您运行一个接受文件列表作为参数的传输程序,您应该通过一系列复选框列出所有文件。用户可以选择和取消选择文件,并通过单击 Submit 激活 rsync shell 脚本。用户不能自己输入文件或使用正则表达式。

本文从两个方面介绍的PHP shell脚本的用法,希望能给你带来帮助。

PHP 相关文章推荐
由php if 想到的些问题
Mar 22 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
PHP开发中的错误收集,不定期更新。
Feb 03 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
php tp验证表单与自动填充函数代码
Feb 22 #PHP
PHP 设计模式之观察者模式介绍
Feb 22 #PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 #PHP
用穿越火线快速入门php面向对象
Feb 22 #PHP
php重定向的三种方法分享
Feb 22 #PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 #PHP
我的php学习笔记(毕业设计)
Feb 21 #PHP
You might like
PHP新手上路(十四)
2006/10/09 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
Python实现基于权重的随机数2种方法
2015/04/28 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
水果花束:Fruit Bouquets
2017/12/20 全球购物
你常见到的runtime exception
2016/09/05 面试题
优秀实习自我鉴定
2013/12/04 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
闪闪红星观后感
2015/06/08 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS