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