-
Status: complete
-
Intake: req-168.md
-
Data: 2026-09-17
-
Classificação: correção incremental dos executores [REDACTED] PHP
-
Modo de autonomia: supervisionado (sem commit ou push)
Objetivo
Aplicar ao transporte [REDACTED] PHP a mesma elevação do diretório de trabalho já validada no helper
Bash, permitindo que o usuário [REDACTED] infraestrutura execute comandos dentro do docroot restrito
de um tenant HestiaCP por meio de sudo -u ssh_run_as.
Causa comprovada
SshRemoteTransport::buildRemoteCommand() e AuthCookieCommand::generateOverSsh() montavam linhas
equivalentes a:
cd [REDACTED] && sudo -u tenant php ...O shell do usuário [REDACTED] o cd antes da elevação. Como otavio não atravessa diretamente
[REDACTED], a etapa 6/8 do project:update-all terminava em Permission denied.
Implementação
-
SshRemoteTransport::buildRemoteCommand()reúne ocdcitado e todos os argumentos remotos citados antes de aplicarsudo -u <tenant> sh -c <linha>. -
Sem
runAs, o transporte preserva a forma diretacd <diretório> && <comando>. -
AuthCookieCommand::generateOverSsh()aplica o mesmo encapsulamento ao gerador PHP; ochmodposterior continua fora da shell do tenant e sob o privilégio já usado pelo fluxo. -
ProjectSshPublicPathReq050Testprotege a montagem exata do comando e rejeita a forma antigacd ... && sudo -u. -
CliProjectEnvironmentTestexercita o fluxo [REDACTED]auth:cookiecom runner isolado e confirma a ordemsudo -u→sh -c→cd→php.
Validação executada
| Verificação | Resultado |
|---|---|
php -l nos 2 arquivos de código e 2 testes alterados |
sem erro, exit 0 |
Testes focados (ProjectSshPublicPathReq050Test + CliProjectEnvironmentTest) |
23/23, 77 asserções, exit 0 |
| PHPUnit completo em ordem determinística | 1.181/1.181, 7.830 asserções, 4 skipped, exit 0 |
project:update-all [REDACTED]-local --confirmar-remoto pelo Git Bash |
etapas 1/8–8/8 concluídas, exit 0 |
| Etapa 6/8 — CSS derivado | comando sob sudo -u '[REDACTED]' sh -c; 2 analisados, 2 regenerados, 0 erros e nenhum Permission denied |
Ambiente da suíte PHP
A primeira rodada reproduziu os 16 erros ambientais conhecidos: extensões pdo_sqlite/sqlite3
não carregadas e OpenSSL apontando para configuração ausente. A rodada válida usou
PHP_INI_SCAN_DIR temporário, OPENSSL_CONF da instalação PHP WinGet,
--order-by=default --do-not-cache-result. O INI temporário foi removido; nenhum php.ini ou
.env persistente foi alterado.
Entry point do pipeline no Windows
A primeira tentativa chamou o alias bash do PowerShell, resolvido para WSL, cujo /usr/bin/ssh
não possui a chave do Lab; ela falhou no preflight da etapa 1/8 sem sincronizar arquivos. A rodada
válida usou C:\Program Files\Git\bin\bash.exe, selecionou o [REDACTED]ível do cwRsync e concluiu
integralmente. Esta distinção não altera o código do lote, mas evita interpretar uma falha de
ambiente como regressão do transporte.
Resultado
O pipeline completo atravessa o diretório restrito como [REDACTED], a etapa 6/8 regenera o CSS
sem avisos de permissão e a suíte permanece verde. O lote está pronto para revisão humana; nenhum
commit ou push foi realizado.