标题: 捣腾php的exec系列函数执行python脚本的问题

时间: 2014-03-09 01:17:13

正文:

这个过程还是比较有参考意义, 甚至不记下来不排除以后自己会再犯的. 总的来说, 主要涉及 linux 环境的用户权限以及标准输入输出和 shell 错误等问题.

我是从 web 网站上, 希望能调用 python 脚本做一些后台处理. 不管是用 exec 还是 system, 或者 popen , 执行一些简单的诸如 pwd ls 命令都没什么问题, 也能正常取到命令执行的返回结果. 但是跑 python 脚本死活就是不行.

        转载请注明出处 http://blog.hickwu.com/posts/324 by Hick

首先想到了可能是用户权限的问题, 通过 php 调用 whoami 命令查到 web 进程是用的 www-data 用户, 权限很低. 查了下 which python , 看对应路径下的 python , 是 root 安装的, 果然 www-data 用户还没执行权限, 果断加上了. 但是还是不行...

然后怀疑是不是 www-data 用户找不到 python 命令? 于是 web 中执行 which python , 并确认 echo $PATH 的路径, 没发现有问题. php 单独调用 python -V , 就是没返回任何信息; 直接终端 su www-data , 执行 python -V 能正常返回 python 版本号 , 说明该账户跑 python 还是没问题的.

然后搜了下 php exec python , 看看果然也有人反馈类似问题, 虽然有些建议显然解决不了问题, 不过从某些实例中还是看出了点苗头, 于是乎 python -V 的默认输出并不是 php 的 popen 等能直接取到的, 我理解应该是标准输出设备? 这点其实还不大确认, 于是试了下换成 python -V 2>&1 , 重定向错误等输出, 果然奏效!

这时候把 python 脚本作为参数调用, 发现还是没任何结果. 跑回终端 su www-data 照样执行, 发现还真有输出某些目录没有写权限之类的. 我理解标准输入输出和错误不就是 0 1 2 了么? 怎么重定向以后还是读不到? 哎... linux 系统还是不够熟练, 基本算是解决了问题, 理解了部分原因, 对这些标准输入输出设备, 还是没理解通透, 改天问问其他同学去.

BTW: 上面的过程还是有些曲折, 单独植入的方式就是 su 到 www-data 用户先实跑---这都不代表全部, 实际上su www-data 以后, 在终端 echo $PATH 和在 PHP 中盗用 echo $PATH 都能看到输出结果并不一致, 大概是 ~/ 目录中的 .profile 之类的影响的.

查看更多文章
分享到:


分享到: