使用户能够通过PHP中的“su – ”在服务器上运行shell命令

我从GitHub下载了一个库,从PHP脚本中运行shell命令。 它是这样工作的:

$process = new Process("su - {$login}"); $process->put($password); $process->put("\n"); $process->put($command); $process->put("\n"); $data = $process->get(); $process->put("exit"); $process->put("\n"); 

它基于proc_open() 。 我用我的localhost与我的Linuxlogin名和密码,一切工作正常。 我想在Web服务器上使用这个库。 我想尝试'www-data'作为login,但不知道什么传递为www-data's密码。 什么使用作为login,以允许用户在真正的Web服务器上使用这个库,而不是本地主机?

(我发布这个到stackoverflow,但他们downvoted它补充说,这不是关于编程和更多关于服务器故障)

首先,从Web服务器的PHP脚本运行系统命令,甚至将密码存储在一个明文的php脚本中实际上是一个坏主意。 想象一下,你正在得到一些用户input来将它传递给$command ,现在如果你错过了一些检查,那么你将允许恶意用户制作用户参数来在你的系统上运行任何命令。

接下来为什么你不能这样做,最有可能是因为两件事:

  1. 您的www数据用户很可能没有任何密码设置。 这不允许用su和那个用户login。

  2. 您的www-data用户shell最有可能设置为/sbin/nologin ,这是有道理的,因为这个用户不应该以真实用户身份login系统。

但是你实际上不需要改变你的用户来运行一个系统程序。 除了很可能你的发行版有www数据用户在其下运行web服务器(使用系统方式),并且你在web服务器上运行的每个PHP脚本都已经在该用户权限下运行。 只需运行你的命令,而不是做su,那应该工作。 像这样的东西:

 $process = new Process($command); $data = $process->get(); 

如果这不起作用,请参阅该库手册,了解如何在没有su情况下产生一个shell,可能$process = new Process('/bin/bash')也可以。