AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1161389
Accepted
John
John
Asked: 2024-06-23 14:57:26 +0800 CST2024-06-23 14:57:26 +0800 CST 2024-06-23 14:57:26 +0800 CST

PHP shell_exec falha, terminal/CLI funciona

  • 772

Preciso obter informações básicas sobre o sistema operacional em PHP:

$p = shell_exec('cat /etc/*-release 2>&1');

Isso retorna:

cat: '/etc/*-release': No such file or directory

O comando funciona bem no terminal/CLI via PuTTY.

Minha melhor interpretação atual é que o PHP requer que um caminho seja definido. Então eu tentei isso:

$p = shell_exec('echo $PATH');

O que retorna:

/bin:/usr/bin

Quando executo echo $PATHdiretamente no terminal, recebo uma :lista delimitada. Então peguei tudo isso e coloquei no arquivo PHP diretamente da seguinte forma:

putenv('/etc');

//plus others

Ainda sem resultado. Eu sei que shell_exec()funciona bem com outros comandos shell_exec('whoami');. No terminal/CLI estou logado exatamente como o mesmo usuário do PHP 8.3.

O que mais estou perdendo?

linux
  • 2 2 respostas
  • 74 Views

2 respostas

  • Voted
  1. vidarlo
    2024-06-23T16:21:12+08:002024-06-23T16:21:12+08:00

    Existem vários problemas aqui.

    1. As pessoas ao menos leem as mensagens de erro que recebem?
    2. Não use comandos shell para ler um arquivo em uma variável! Usar fopen.
    3. Não faça globulação. Globs são expandidos pelo shell, mas o PHP não é um shell, portanto não faz globbing. Ele entrega seu comando exato ao shell e pede ao shell para executá-lo. E sim, *-releaseé um nome de arquivo válido .
        [~]$ ls -la /tmp/\*-releases 
        -rw-r--r-- 1 vidarlo users 0 Jun 23 10:16 /tmp/*-releases
        [~]$ 
    
    1. Globbing potencialmente abre você para ataques. Se você glob, não terá controle sobre quais arquivos acabará lendo. Esse é um possível problema de segurança. Provavelmente não neste caso, como você está lendo /etc, mas...
    2. Você não tem um conhecimento básico sobre o seu ambiente, quando espera que a modificação de um parâmetro de caminho mude alguma coisa - o problema não é que o catcomando não foi encontrado, é que o arquivo que você fornece como parâmetro não foi encontrado... Um entendimento geral do plataforma é um bom ponto de partida para programação.
    3. putenv('/etc');não é assim que putenvfunciona . Variáveis ​​de ambiente são geralmente key=value-pares.
    4. Não poste no serverfault. Não se trata de gerenciamento de TI, trata-se apenas de programação. Além disso, você provavelmente deveria dedicar algum tempo para aprender a plataforma em que está trabalhando.
    • 1
  2. Best Answer
    John
    2024-07-03T01:45:38+08:002024-07-03T01:45:38+08:00

    O problema era que o PHP foi configurado para rodar na chrootprisão. Eu havia esgotado todas as outras possibilidades. Só descobri graças ao comentário do @vidarlo.

    Consegui resolver o problema no WHM através do plugin CageFS. O usuário Linux que o PHP usa foi configurado para executar e eu o removi da associação.

    • 0

relate perguntas

  • Como descobrir detalhes sobre hardware na máquina Linux?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve