php - suPHP 和 Lazarus 控制台应用程序遇到奇怪的 shell 故障

标签 php linux console lazarus suphp

我确实对这个标题表示歉意,但找不到任何其他解释。我的公司正在运行带有最新 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;

如果我手动运行这个应用程序,一切都会运行良好。但是,如果我使用 shell_exec 从 PHP 应用程序运行它,整个应用程序会在旁边运行(甚至是最后的日志条目),并启动其他 shell 应用程序(ls、cp mkdir、useradd、chmod 等) 我实际上不知道问题是什么了。 我在 stdout/stderr、suPHP 日志甚至 Apache2 日志中没有收到任何错误。 从 PHP 运行也运行良好大约一周,但显然停止了工作。

提前致谢

最佳答案

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

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

最后,你生成了新的 shell。命令完成后,shell 将被销毁,下一个命令将产生另一个新的 shell。因此,这样做“cd”是毫无意义的。

关于php - suPHP 和 Lazarus 控制台应用程序遇到奇怪的 shell 故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21432981/

相关文章:

javascript - 表单没有从数据库中获取全文

php - openssl_encrypt 的密码参数是什么?

linux - 仅尾部一行的前几个字符

linux - 在 Linux 上的 bash 中获取昨天的日期,DST 安全

javascript - 加载页面时 J-Query 错误

console - Autohotkey 错误的击键发送到控制台

php - Laravel 保护列免受不可空/默认值的批量分配

php 正则表达式,确保用户不会添加太多新换行符

linux - 恢复已删除的容器docker

C# 控制台 : Write while reading and retain structure