文档章节

PHP在Linux下运行Shell命令

kisshua
 kisshua
发布于 2014/06/05 14:22
字数 738
阅读 56
收藏 1
点赞 0
评论 0

原本在本机开发PHP的时候,Shell调用一切正常。上线的时候才反应到线上的服务器对权限做了严格的控制,一顿折腾之后梳理出在严格权限控制的Linux上如何通过Nginx/Apache 以Web的方式调用Shell命令,比如调用java编译或者执行java程序。

Web服务器使用www用户启动。分为两种情况:一种是命令是通过root安装的,并不能直接把权限直接赋给www用户,比如/usr/local/nginx/sbin/nginx;一种是www用户对要执行的命令有绝对的权限,但是由于缺少某些环境变量,执行的程序如果用到了这些变量就得提前再次设定环境变量。

先说第一种,其实php.ini里面已经定义了不可以调用的命令,默认情况下exec, system之类都不能执行。首先要去php.ini里面把

disable_functions=

这一项里面定义的那些调用Shell脚本的函数移出列表,然后重启Nginx的PHP-PFM或者Apache。可以测试一下

<?php echo exec(“pwd”); ?>

正常情况下应该就可以看到当前的路径信息了。但是要想执行一些root才能执行的命令,比如重新加载Nginx配置文件,还需要一些额外的操作,这里参考http://bbs.chinaunix.net/thread-3693263-1-1.html

1、设置 sudo 配置文件 可写权限
chmod u+w /etc/sudoers

2、增加 www 用户的 nginx 脚本管理权限
www     ALL=(root)      NOPASSWD: /etc/init.d/nginx

3、关闭 【强制控制台登录】执行
【非常重要】,注释该行 我的问题就出在这里,开启了这个选项之后。在PHP中怎么调用,都没有执行结果
#Defaults    requiretty

4、还原 sudo 配置权限  440
【非常重要】,如果不还原权限。在PHP中怎么调用,都没有执行结果。
chmod u-w /etc/sudoers

5、调用php
$result2 = exec(“/usr/bin/sudo /etc/init.d/nginx stop”,$result);
var_dump($result);
var_dump($result2);

再看看如果调用Java编译并执行。www用户拥有对/work/java目录的执行权限。直接上代码:

Java的,文件名”TestJava.java”

public class TestJava{
public static void main(String[] args) {
System.out.println(“Hello World!”);
}
}

PHP的,文件名”test.php”

<?php

function del_file($file){
if(file_exists($file) && unlink($file) ){
echo “del “.$file.”<br />\r\n”;
}
}

function execute($exe){
echo $exe.”<br />\r\n”;
$r=exec($exe, $res);
var_dump($res);
echo “<br />———————-<br />\r\n”;
var_dump($r);
echo “<br />———————-<br />\r\n”;
}

$target_file = “TestJava.class”;
$output_file = “output.txt”;
$src=”/work/web/services.adsage.com/deploy/monitor/test/TestJava.java”;
$bin=”TestJava”;
$jcommon = “export JAVA_HOME=/work/java\nexport JRE_HOME=$JAVA_HOME/jre\nexport PATH=$JAVA_HOME/bin:$PATH\n/work/java/bin/”;
$javac=$jcommon.”javac “.$src;
$javab=$jcommon.”java “.$bin.” >> “.$output_file;
del_file($target_file);
del_file($output_file);

execute($javac);
execute($javab);

echo “final:<br />\r\n”;
$output=file_get_contents($output_file);
echo $output;
?>

通过Web浏览结果:

del TestJava.class
del output.txt
export JAVA_HOME=/work/java export JRE_HOME=/jre export PATH=/bin: /work/java/bin/javac /work/web/services.adsage.com/deploy/monitor/test/TestJava.java
array(0) { }
———————-
string(0) “”
———————-
export JAVA_HOME=/work/java export JRE_HOME=/jre export PATH=/bin: /work/java/bin/java TestJava >> output.txt
array(0) { }
———————-
string(0) “”
———————-
final:
Hello World!

 

本文转载自:http://www.shootsoft.net/221

共有 人打赏支持
kisshua
粉丝 30
博文 141
码字总数 33839
作品 0
武汉
后端工程师
Crontab 让linux定时执行shell脚本

使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令。例如系统管理员安排一个备份任务使其每天都运行 入门 # crontab –e 这样可以已编辑模式打开个人的crontab配置文件,然...

酱醋茶丶
2015/07/31
0
0
Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/shcd ~mkdir shell_tutcd shell_tut for ((i=0; i<10; i++)); do done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到...

quanpower
2014/03/23
0
0
LNMP ( CentOS Nginx MySQL PHP ) 环境搭建

确定测试环境和软件版本 Linux : centOS-6.2 Nginx : nginx-1.2.0 MySQL : mysql-5.5.3 PHP : php-5.4.1 获取相关开源程序 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libp......

Shamrocker
2012/09/03
0
0
16个桌面Linux用户必须要知道的Shell命令

有些人仍然会有这中愚蠢的想法,他们认为使用Linux就必须使用Linux shell命令。胡说!你可以不懂得任何Linux命令,比如说ps,grep,ls等,但是你仍然可以使用很多现代的Linux桌面发行版。 Li...

王振威
2012/05/06
0
28
Linux下的Shell工作原理

Linux系统提供给用户的最重要的系统程序是Shell命令语言解释程序。它不 属于内核部分,而是在核心之外,以用户态方式运行。其基本功能是解释并 执行用户打入的各种命令,实现用户与Linux核心...

yhhedu
2014/05/04
0
0
用service命令和chkconfig命令管理服务进程

  service命令可以快速地开启和停止linux中的服务程序,这在调试过程中非常有用.chkconfig命令可以快速地设置开机时需要自动启动的服务程序.   这两个命令的功能都可以通过其他方法实现,...

吕明明
2013/06/14
0
1
Linux命令、编辑器与Shell编程

Linux命令、编辑器与Shell编程 本书以实用为原则,以 Linux系统管理为核心,在深入剖析 Linux系统运行原理的基础上,重点介绍 了 Linux系统管理中常见命令的各种用法、编辑器的使用及利用 Sh...

李航421
2013/09/05
0
0
centos下编译安装LAMP环境

一、LAMP 1.LAMP简介 LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而言都是在它所代表的方面功能非常强大的组件...

ZIJIAN1012
06/26
0
0
PHP不支持多线程,有时候处理问题不是那么爽,今天谈论一下PHP定时执行的方法

PHP定时执行的三种方式实现 1、windows 的计划任务 2、linux的脚本程序 3、让web浏览器定时刷新 具体实现 windows计划任务 PHP很少在win服务器上跑,具体实现也不再深究,看网上实现的原理大...

anziguoer
2014/04/10
0
2
Linux下用crontab定时执行PHP程序

工作中经常有在Linux下执行PHP程序的需求,开发组同事们的做法是:先是在crontab里执行一个SHELL程序,然后让SHELL程序再运行PHP程序,这种做法其实是相当没有效率的。 在Linux下可以使用cro...

hengfeng_su
2013/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring boot中swagger2使用

1.pom.xml中添加 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version>......

说回答
10分钟前
0
0
tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
22分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
27分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
28分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
42分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
43分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
50分钟前
2
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
54分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
今天
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部