Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
suPHP和Lazarus控制台应用程序遇到奇怪的外壳故障_Php_Linux_Console_Lazarus_Suphp - Fatal编程技术网

suPHP和Lazarus控制台应用程序遇到奇怪的外壳故障

suPHP和Lazarus控制台应用程序遇到奇怪的外壳故障,php,linux,console,lazarus,suphp,Php,Linux,Console,Lazarus,Suphp,我对这个标题表示歉意,但找不到其他解释。我的公司使用最新的LTS Ubuntu+Apache2+suPHP运行开发服务器。为了处理它,我正在编写一个Zend2和Lazarus应用程序。使用Zend的web部件运行良好。 问题是用Lazarus编写的控制台应用程序。它运行两个类,创建数据库和用户,下载框架等等。此外,出于管理目的,它还应该运行几个shell命令(具有root权限)。为了获得这些权利,我使用了一个非常丑陋的解决方案,使用echo mymagicpassword | sudo-S my

我对这个标题表示歉意,但找不到其他解释。我的公司使用最新的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\u exec
从PHP应用程序运行它,整个应用程序(甚至是最后的日志条目)都会在旁边运行,启动其他shell应用程序(ls、cp mkdir、useradd、chmod等等) 我真的不知道问题出在哪里了。 我在stdout/stderr、suPHP日志甚至Apache2日志中都没有收到任何错误。 另外,从PHP运行大约一个星期都很顺利,显然停止了工作


提前感谢

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

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


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

更改了复制参数但没有成功。stdout/stderr缓冲区不会超出其范围,因为我知道触发了哪些命令。但是,我将每个命令作为
echo asdf | sudo-S command
参数传输到可执行文件/bin/sh。这样,sh使用root权限运行我的命令。如前所述,我如果我手动启动应用程序,它运行得很好。如果它是由PHP启动的,那么除了shell执行之外,它还可以执行所有操作。请注意,结果应该在一个参数项中结束。(-c在一个参数项中,整个字符串在第二个参数项中执行)。因为它可以包含空格,所以使用settext等可能不是最好的