shell_exec返回NULL,但从控制台尝试时,它的工作原理

我有三个PHP脚本。 一,我从init脚本开始。 第二个是由第一个本身启动的,第二个则使用shell_exec通过定期传递各种参数来获得第三个脚本的输出。

但是这并没有发生。 当var_dump shell_exec的输出,在第二个脚本,我得到NULL 。 但是当我在第二个脚本中打印shell_exec中使用的实际命令并尝试将其input到控制台时,它工作得非常好!

我尝试从同一个用户的控制台启动init脚本的命令。

这可能是一个权限问题。 但我有适当的权限设置ie

  1. + x为第三个脚本
  2. 第三个脚本(实际上所有这三个脚本)都属于同一个用户,我使用控制台的组

注意 – 我尝试用shebang启动第三个脚本,以及在脚本path之前删除shebang并添加php 。 有了根,一切运行良好。

另外,还有一点需要注意,第一个脚本将第二个脚本的输出redirect到一个日志文件(这是我在shell_execfind第三个返回NULL脚本的地方)

更新:来自使用shell_exec第二个脚本的代码

 $command = "/var/data/user-data.php '{$user}' '{$request['token']}' '{$request['secret']}'"; $data = json_decode( shell_exec( $command ), true ); 

我尝试打印$command ,也var_dump( shell_exec( $command ) ) 。 前者返回所期望的(params),后者返回NULL

如果不直接评论问题是什么 –

停止。 不要掏腰包 这是一个安全雷区。

 $command = "/var/data/user-data.php '{$user}' '{$request['token']}' '{$request['secret']}'"; 

如果用户通过,会发生什么,说:

 http://yoursite.com/index.php?token=';rm -rf / # 

答案:您的整个服务器被删除(或至少PHP脚本用户可以触摸的任何东西)。 当然,还有其他更隐秘的事情可以做。 而这种漏洞可以并且将会被自动扫描器发现,而这些自动扫描器会自动根据你的服务器。

所以不要掏腰包,尤其是当你只是调用另一个PHP脚本时。 把你的代码放到一个函数中,包含包含它的php文件,当你需要数据时调用函数。