PHP执行linux系统命令的常用函数使用说明


Posted in PHP onApril 27, 2010

system函数
说明:执行外部程序并显示输出资料。
语法:string system(string command, int [return_var]);
返回值: 字符串

详细介绍:
本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中。同样值得注意的是若需要处理用户输入的资料,而又要防止用户耍花招破解系统,则可以使用 EscapeShellCmd()。若 PHP 以模块式的执行,本函数会在每一行输出后自动更新 Web 服务器的输出缓冲暂存区。若需要完整的返回字符串,且不想经过不必要的其它中间的输出界面,可以使用 PassThru()。

实例代码:

< ?php 
$last_line = system('ls', $retval); 
echo 'Last line of the output: ' . $last_line; 
echo '<hr />Return value: ' . $retval; 
?>

exec函数
说明:执行外部程序。
语法:string exec(string command, string [array], int [return_var]);
返回值: 字符串

详细介绍:
本函数执行输入 command 的外部程序或外部指令。它的返回字符串只是外部程序执行后返回的最后一行;若需要完整的返回字符串,可以使用 PassThru() 这个函数。

要是参数 array 存在,command 会将 array 加到参数中执行,若不欲 array 被处理,可以在执行 exec() 之前呼叫 unset()。若是 return_var 跟 array 二个参数都存在,则执行 command 之后的状态会填入 return_var 中。

值得注意的是若需要处理使用者输入的资料,而又要防止使用者耍花招破解系统,则可以使用 EscapeShellCmd()。

实例代码:

< ?php 
echo exec('whoami'); 
?>

popen函数
说明:打开文件。
语法:int popen(string command, string mode);
返回值: 整数

详细介绍:
本函数执行指令开档,而该文件是用管道方式处理的文件。用本函数打开的文件只能是单向的 (只能读或只能写),而且一定要用 pclose() 关闭。在文件操作上可使用 fgets()、fgetss() 与 fputs()。若是开档发生错误,返回 false 值。

实例代码:

< ? 
$fp = popen("/bin/ls","r" ); 
?>

PHP监控linux服务器负载

在实际项目的应用中,我们由于各种条件的现实,利用PHP来实现服务器负载监控将是一种更为灵活的方式。

由于Web Server以及PHP的实现方式所限,我们在现实环境中很难利用PHP去调用一些Linux中需要root权限才能执行的程序,对此,我从网上找到另外一种方式来绕开这个限制。首先先写个c程序中转调用系统命令,然后用PHP去执行此c程序。

c程序

首先写个c文件,比如/usr/local/ismole/w.c

#include<stdio.h> 
#include<stdlib.h> 
#include<systypes.h> 
#include<unistd.h> int main() 
{ 
uid_t uid ,euid; 
//note 获得当前的uid 
uid = getuid(); 
//note 获得当前euid 
euid = geteuid(); 
//note 交换这两个id 
if(setreuid(euid, uid)) 
perror("setreuid"); 
//note 执行将要执行linux系统命令 
system("/usr/bin/w"); 
return0; 
}

编译该文件gcc -o w -Wall w.c,这时会在当前目录下生成程序w。改变此程序的属主chmod u+s ./w。
PHP执行

文件内容如下,放在web目录下,访问就会输出当前的服务器负载情况。

<?php 
/* 
More & Original PHP Framwork 
Copyright (c) 2007 - 2008 IsMole Inc. $Id: serverMonitor.php 408 2008-12-02 08:07:40Z kimi $ 
*/ 
//note key的验证过程 
if($key != $authkey) { 
// exit('key error); 
} 
$last_line = exec('/usr/local/ismole/w', $retval); 
$returnArray = explode("load average: ", $retval[0]); 
$returnString = $returnArray[1]; 
echo $returnString; 

 按照上面的实例,我们可以用PHP来做任何我们想执行的Linux系统命令,SVN更新,服务器监控,备份,恢复,日常维护等等。
PHP 相关文章推荐
apache+php+mysql安装配置方法小结
Aug 01 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
phpstorm 配置xdebug的示例代码
Mar 31 PHP
如何在PHP中使用AES加密算法加密数据
Jun 24 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
Sep 25 PHP
php 使用post,get的一种简洁方式
Apr 25 #PHP
Windows下安装Memcached的步骤说明
Apr 25 #PHP
PHP 文件缓存的性能测试
Apr 25 #PHP
PHP 中文处理技巧
Apr 25 #PHP
PHP 网络开发详解之远程文件包含漏洞
Apr 25 #PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 #PHP
PHP CURL模拟GET及POST函数代码
Apr 25 #PHP
You might like
PHP单例模式与工厂模式详解
2017/08/29 PHP
JavaScript 异步调用框架 (Part 6 - 实例 &amp; 模式)
2009/08/04 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
微信小程序模版渲染详解
2018/01/26 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
Python中使用urllib2防止302跳转的代码例子
2014/07/07 Python
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
python将字符串转换成数组的方法
2015/04/29 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Django 重写用户模型的实现
2019/07/29 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
python getpass模块用法及实例详解
2019/10/07 Python
python中return的返回和执行实例
2019/12/24 Python
python中with用法讲解
2020/02/07 Python
Python如何对齐字符串
2020/07/30 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
2020/10/28 Python
给客户的感谢信
2015/01/21 职场文书
2015年招商引资工作总结
2015/04/25 职场文书