php system 执行失败,PHP 执行 system、exec 等函数发生错误

2012-12-06 20:45

1932人阅读

评论(0)

往往在调用system、exec 等函数时,要么没有反应,要么出错:

原因很多,以下是抄别人的:

====================================================================================

错误分析:

1、Warning: system() has been disabled for security reasons

该错误是由于服务器安全配置将system函数关闭了,编辑php.ini查找 disable_functions 将等号后面的 system 去掉即可。

2、Warning: system() [function.system]: Unable to fork

该错误是由于当前站点的运行帐号无法访问cmd.exe,找到windows\system32\cmd.exe 属性,安全,添加当前站点的运行帐号权限,或 users组权限即可。

3、在web访问下执行没有任何响应也不报错,使用php cli命令行执行却可以正常返回结果

该错误一般由于WINDOWS系统路径引起,你的程序中大概使用了绝对路径去访问程序比如:

system('D:\server\DLL\IECapt.exe --url=http://tech.cncms.com --out="D:\web\tt.fei.cn\htdocs\ttt\tech.png"');

此时用命令行执行结果OK,但用WEB访问就是空白也没错误。

修正方法,将文件的访问路径改为相对即可:

将IECapt.exe 复制到你的站点程序当前目录下,并将代码改为:

system('IECapt.exe --url=http://www.baidu.com --out=t/tech.png');

再次访问页面,OK,结果出来了。

====================================================================================

但是当我在执行的时候:

system("/sbin/ifconfig

>/home/ago/Desktop/webshell.log",$retval);  // return 2   Misuse of

shell builtins (according to Bash documentation)

system("ifconfig >/home/ago/Desktop/webshell.log",$retval);            // return 127  "command not found"

网上找了很多教程和解决办法:

要写文件的话,确保有权限操作文件夹

I am using this php code:

exec("unrar e file.rar",$ret,$code);

and getting an error code of illegal command ie 127

... but when I am using this command through ssh its working ...

because unrar is installed on the server ... so can anyone guess why exec is not doing the right stuff?

=====================================================================

Try using the direct path of the application (/usr/bin/unrar of whatever), it sounds like php can't find the application

=====================================================================

If you have chrooted apache and php, you will also want to put /bin/sh into the chrooted environment. Otherwise, the exec() or passthru() will not function properly, and will produceerror code 127, file not found.

=====================================================================

I found the problem. The problem was my security-paranoid OpenBSD. When upgrading from 3.1 to 3.2 they added:

Apache runs chroot'd by default. To disable this, see the new -u option.

The chroot prevented Apache from accessing anything outside of a

directory, so I moved everything into the apache directory including

netpbm. Everything was accessible and executable, but I guess it was

still in some sort of "safe mode" because the exec() always

returned 127.

Anyway, running httpd with the -u option went back to the less secure non chroot'd apache startup, which allowed the exec() to work again.

=====================================================================

ERROR-CODE

Linux        http://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF

http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html

windows        http://www.hiteksoftware.com/knowledge/articles/049.htm

=====================================================================

"Remember to use the full path (IE '/usr/local/bin/foo' instead of

'foo') when using passthru, otherwise you'll get an exit code of 127 (command not found).

Remember, you'll also get this error if your file does not have executable permission."

"If you have chrooted apache and php, you will also want to put /bin/sh into the chrooted environment. Otherwise, the exec() or passthru() will not function properly, and will produce error code 127, file not found."

=====================================================================

环境:PHP+linux下的apache2

php中的exec函数可以执行很多命令(脚本)使用比较方便,但是在linux下需要给与权限。修改/etc/sudoer文件,做两处改动:

1)

在文件中添加apache的用户,我用的apache2的用户名是www-data,有的是daemon、httpd等(查看一下自己的apache的配

置文件即可)。添加的格式:www-data ALL=(ALL) NOPASSWD: ALL(格式在/etc/sudoer文件中有,使用

visudo)。

2)

注释掉default requiretty.(大部分时候,exec不能正确执行都是由这一行没有注释掉引起的)

后记:之所以发文是因为每次总是忘记了第二条。导致在网上搜索,不过好像没有人真正解释过。希望此文能提醒自己,帮助别人吧。......

============================================================================================

因为sudo配置信息必须保证php网页执行用户(我这里是apache)具备合适的权限执行svn 命令。

为此,修改sudo配置文件,直接键如visudo命令编辑配置文件:

1. 注释Defaults requiretty

Defaults requiretty修改为 #Defaults requiretty, 表示不需要控制终端。

否则会出现sudo: sorry, you must have a tty to run sudo

2. 增加行 Defaults visiblepw

否则会出现 sudo: no tty present and no askpass program specified

3. 赋予apache用户执行svn权限

如,增加行:apache ALL=(ALL) NOPASSWD: /usr/bin/svn

注:NOPASSWD可以使在命令执行时不需要交互输入apache用户的密码

============================================================================================

再试了各种方法之后,发现都不行,最后我把网站根目录从 /var/www迁移到了/home/test ,下面,竟然莫名就好了,sudoer文件都没有修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate锁定模式– PESSIMISTIC_FORCE_INCREMENT锁定模式如何工作

介绍 在上 一篇 文章中 ,我介绍了OPTIMISTIC_FORCE_INCREMENT锁定模式,并将其应用于将子实体版本更改传播到锁定的父实体。 在本文中,我将介绍PESSIMISTIC_FORCE_INCREMENT锁定模式,并将其与乐观的锁定模式进行比较。 相像多于不…

C语言中字符串的结束标志是什么

C语言中字符串的结束标志是【\0】。C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,字符串总是以【\0】作为结束符。\0就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。\0就是 字符串结束标…

php 5.6.27 在某些机器上正常,在 Windows 10 64、PHP 5.6 下重命名中文名文件,提示错误的解决...

1、重命名某个目录中的文件名,其代码,如图1图12、报错:rename(E:/wwwroot/avatar/BEIJI/侯森.jpg,E:/wwwroot/avatar/BEIJI/378477.jpg): ϵͳ�Ҳ���ָ���&am…

c语言中字符常量是什么?

c语言中字符常量是什么?字符常量:一个用单引号括起来的单个字符(或字符转义序列或三字母词)实质(含义):是一个整形值。属于四大基本数据类型(分别是整型,浮点型&#xff…

Hibernate锁定模式– OPTIMISTIC_FORCE_INCREMENT锁定模式如何工作

介绍 在我以前的文章中 ,我解释了OPTIMISTIC锁定模式是如何工作的,以及它如何帮助我们同步外部实体状态更改。 在本文中,我们将介绍OPTIMISTIC_FORCE_INCREMENT锁定模式的使用模式。 使用LockModeType.OPTIMISTIC ,将在当前正在运…

java camel swagger,java – CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES没有反映在swagger.json中

我正在使用Jersey,Jax-rs和swagger(Spring for injection).我的对象有一些成员和嵌入对象,其名称由多个单词组成,在代码中我使用camelCase.我定义了一个解析器,因此按照标准惯例将它们作为下划线发出.问题是,招摇是显然没有拿起这个解析器,所以对象仍然在swagger json中显示为c…

c语言的输入输出语句有哪些?

c语言的输入输出语句有:“getchar(void);”和“putchar(int c);”、“scanf("格式控制字符串",地址列表);”和“printf("格式控制字符串",输出列表);”、“gets()”和“puts()”等等。一:控制台输入输出(1)字符数据的输入/输出字符输…

primefaces_PrimeFaces:在动态生成的对话框中打开外部页面

primefaces我已经在即将出版的PrimeFaces Cookbook版本2中写过一篇食谱的博客。 在这篇文章中,我想发表第二篇关于一个名为Dialog Framework的小型框架的文章。 我个人喜欢它,因为我记得我为使用Struts框架付出同样的代价。 当您想将外部页面加载到弹出窗…

c语言源文件经过编译后生成文件的后缀是什么?

c语言源文件经过编译后,生成文件的后缀是“.obj”。C语言源文件后缀名是“.c”,编译生成的文件后缀名是“.obj”,连接后可执行文件的后缀名是“.exe”。C语言创建程序的步骤:编辑:就是创建和修改C程序的源代码-我们编写…

php 去掉nbsp,php 正则去掉pnbsp;/p 空格 nbsp;

$strFactory Supply High Quality Maitake Mushroom Extract Powder Bulk$uuupreg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/","",$str);echo str_replace(很完美php的str_replace函数怎么把php的str_replace函数怎么把$html"fdasf";echo $stri…

java编译器jdk版本_以编程方式确定Java类的JDK编译版本

java编译器jdk版本当需要确定使用哪个JDK版本来编译特定的Java .class文件时, 通常使用的方法是使用javap并在javap输出中查找列出的“主要版本”。 我在我的博客文章Autoboxing,Unboxing和NoSuchMethodError中引用了这种方法,但是在继续以编…

c语言指针用法有哪些

c语言指针用法:一,指针定义:指针变量的取值范围取值0~4G,是一种数据类型(无符号整数,代表了内存编号)。它可以用来定义变量(与int、long一样),与int、long不同的它存储整…

java转换汇编,请问如何把JAVA程序转为汇编?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.util.Scanner;public class Lab1 {public static void main(String arg[]){int a,i,j,n;boolean flagtrue;Scanner inputnew Scanner (System.in);System.out.printf("Enter an integer that is greater than 1:&…

ogm session_带有Hibernate OGM的NoSQL –第一部分:持久化您的第一个实体

ogm sessionHibernate OGM的第一个最终版本已经发布 ,团队从发布狂潮中恢复了一些。 因此,他们考虑开设一系列教程风格的博客,使您有机会轻松地从Hibernate OGM重新开始。 感谢Gunnar Morling( gunnarmorling )创建了本…

php array assoc,如何学习PHP array_intersect_assoc()

如何学习PHP array_intersect_assoc()定义和用法array_intersect_assoc() 函数返回两个或多个数组的交集数组。与 array_intersect() 函数 不同的是,本函数除了比较键值,还比较键名。返回的数组中元素的键名保持不变。语法array_intersect_assoc(array1,…

c语言volatile关键字的作用是什么?

一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执…

jaxb解析字符串xml_一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)的枚举

jaxb解析字符串xml尽管用于XML绑定的Java体系结构 ( JAXB )在名义情况下(尤其是自Java SE 6以来) 相当容易使用,但它也存在许多细微差别。 一些常见的细微差别是由于无法将 XML架构定义 (XSD)类…

php伪静态后不能访问html,php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法:首先判断文件是否存在;然后设置存在则不rewirte,不存在且符合规则才rewrite;最后修改htaccess文件即可。推荐:《PHP视频教程》具体问题:PHP伪静态后不能访问纯html文件.…

c语言中,char型数据是以什么形式存储的?

C语言 字符型(char)简介字符型(char)用于储存字符(character),如英文字母或标点。严格来说,char 其实也是整数类型(integer type),因为char 类型储…

声明式编程与函数式编程_实用程序类与函数式编程无关

声明式编程与函数式编程最近,我被指控反对函数式编程,因为我将实用程序类称为反模式 。 绝对是错的! 好吧,我确实认为它们是一个糟糕的反模式,但是它们与函数式编程无关。 我相信有两个基本原因。 首先,函数…