我确实为标题道歉,但找不到任何其他解释。我的公司正在使用最新的 LTS Ubuntu+Apache2+suPHP 运行开发服务器。为了处理它,我正在编写一个 Zend2 和 Lazarus 应用程序。Zend 的 Web 部件运行良好。问题是用 Lazarus 编写的控制台应用程序。它运行几个类,创建数据库和用户,下载框架等等。它还应该运行几个用于管理目的的 shell 命令(具有 root 权限)。为了获得权利,我使用了一个非常丑陋的解决方案,使用echo mymagicpassword | sudo -S mymagiccommand
. 这是一个片段:
constructor TRootProcess.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Options:=[poUsePipes,poWaitOnExit];
Executable:='/bin/sh';
Parameters.Add('-c');
Parameters.Add('echo %pwd% | sudo -S ');
end;
function TRootProcess.ExecuteCommand(command: String): String;
var
str: TStringList;
begin
str:=TStringList.Create;
command:=Copy(Parameters.GetText, 0, Length(Parameters.GetText)-1)+command;
command:=StringReplace(command,'%pwd%','mymagicpassword',[rfReplaceAll]);
Parameters.SetText(PChar(command));
Execute;
str.Clear;
str.LoadFromStream(Output);
Result:=str.Text;
end;
如果我手动运行这个应用程序,一切都会运行良好。但是,如果我使用 PHP Applicaiton 从 PHP Applicaiton 运行它shell_exec
,整个应用程序都会运行(甚至是最后的日志条目),然后启动其他 shell 应用程序(ls、cp mkdir、useradd、chmod 等)我实际上不知道,这是什么问题是,不再。我在 stdout/stderr、suPHP 日志甚至 Apache2 日志中没有收到任何错误。从 PHP 运行也顺利进行了大约一周,显然停止工作。
提前致谢