我从 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
的 Linux 登录名和密码上使用它,一切正常。我想在 Web 服务器上使用这个库。我想尝试'www-data'
以登录名登录,但不知道要传递什么www-data's
密码。使用什么作为登录名才能允许用户在真实的 Web 服务器(而不是本地主机)上使用此库?
(我把这个问题发到了 stackoverflow 上,但他们给了差评,并说这个问题与编程无关,更多的是服务器故障)
答案1
首先,从 Web 服务器 PHP 脚本运行系统命令,甚至将密码以明文形式存储在 php 脚本中,这其实是个坏主意。想象一下,您正在获取一些用户输入并将其传递给$command
,现在如果您错过了一些检查,您将允许恶意用户制作用户参数以在您的系统上运行任意命令。
接下来你实际上不能这样做很可能是因为以下两个原因:
您的 www-data 用户很可能没有设置任何密码。这将禁止
su
该用户登录。您的 www-data 用户 shell 很可能设置为类似的内容,
/sbin/nologin
因为该用户不应该以真实用户身份登录系统。
但实际上,您不需要更改用户来运行系统程序。此外,您的发行版很可能有 www-data 用户在其下运行 Web 服务器(使用系统方式),并且您在 Web 服务器上运行的每个 PHP 脚本都已在该用户权限下运行。只需运行命令而不执行 su 即可。如下所示:
$process = new Process($command);
$data = $process->get();
如果这不起作用,请参阅该库手册,了解如何在没有的情况下生成 shell su
,可能$process = new Process('/bin/bash')
也会起作用。