Por que o comando shell é executado a partir da linha de comando, mas não do script php?

2

Estou escrevendo um script que faz backup de alguns arquivos usando o utilitário de linha de comando s3cmd amazon s3.

Quando executo um comando shell s3cmd a partir do shell, ele faz o backup do arquivo. Quando executo o mesmo comando do script PHP (usando backticks ou shell_exec) ele não faz nada e não retorna nenhum resultado para o script PHP.

Outros comandos shell são executados com sucesso de maneira semelhante (backticks), como mysqldump e tar. usando whoami no script e shell eu encontrei o usuário shell é root e usuário do script PHP é 'apache'.

Como posso fazer o script PHP executar o comando com sucesso? (Eu sei que o comando deve funcionar porque copiá-lo como está para o shell funciona).

    
por Niro 06.12.2009 / 10:12

5 respostas

3

O problema com s3cmd neste caso não é o arquivo s3cmd, mas sim o arquivo de configuração, cujo padrão é ~ / .s3cfg O script da CLI que é executado como root tem acesso de leitura a ele, mas o servidor da web do apache não. Tudo o que você precisa fazer é copiar o arquivo de configuração para outro local e chown-lo para que o usuário do apache possa acessá-lo, então na opção shell_exec use -c FILE de s3cmd. Além disso, você precisa configurar env var HOME para uma string vazia, porque o script s3cmd dá prioridade sobre o -c. então seu shell_exec será parecido com: shell_exec ('export HOME=""; s3cmd -c ....');

    
por 16.02.2010 / 09:25
1

algumas perguntas que podem ajudá-lo a descobrir de onde vem o problema:

  • Você tem direitos adequados no diretório em que você tenta escrever?
  • é o comando executável como usuário simples (não sei s3, desculpe)
  • deu uma olhada nos registros?
por 06.12.2009 / 11:43
1

Em geral, esses problemas geralmente são causados por diferenças no ambiente. O $ PATH pode ser diferente, por exemplo, e em vez de depender dele para encontrar um programa para você, você deve certificar-se de configurá-lo para incluir os diretórios necessários ou incluir o nome completo do caminho no comando.

    
por 06.12.2009 / 12:40
1

Procure na saída de phpinfo () para ver se essas chamadas de função estão listadas em disable_functions, o que impede que sejam executadas.

    
por 06.12.2009 / 14:32
1

Se você está executando isso a partir de um script PHP, você quer dizer que um script PHP está sendo executado a partir da linha de comando ou você está sendo acionado por algo através do servidor web?

Se você estiver tentando acioná-lo a partir de uma interface da Web, há uma excelente chance de ele estar tentando ser executado como usuário nobody no grupo nobody que não tem permissões reais por motivos de segurança.

Você deve ser capaz de testar o contexto do usuário como parte do seu script, mas há uma variedade de coisas que você pode alterar para abordar o problema - algumas das quais podem depender do seu ambiente e / ou nível técnico. Possibilidades incluem bits setuid, suexec, alterando o contexto do Apache, etc.

    
por 06.12.2009 / 17:35

Tags