0

我确实为标题道歉,但找不到任何其他解释。我的公司正在使用最新的 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 运行也顺利进行了大约一周,显然停止工作。

提前致谢

4

1 回答 1

0

这个问题没有很好地描述。至少,带有 Copy( 的行是错误的,因为字符串从索引 1 开始,而不是 0。

loadfromstream 也不安全。特别是对于较大的输出,这可能无法完成。请参阅 Lazarus/FPC wiki 中的“TProcess large I/O”。

最后,您生成新的 shell。命令完成后,shell 将被销毁,下一个命令将有另一个新的 shell。所以那样做“cd”是毫无意义的。

于 2014-01-29T15:39:02.483 回答