gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:14 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com