A função PHP Exec reporta falha em alguns comandos que funcionam pelo SSH

1

Estou no CentOS 6 64bit com PHP 5.4.12.

Esse é um comportamento muito estranho do PHP.

Veja o seguinte script:

echo 'Trying Query: whereis jbig2dec<br>';
exec('whereis jbig2dec',$output) or die('Failed');

$location=explode(' ',implode($output));
$location=$location[1];

echo 'Result: '.implode($output)."<p>";

echo 'Trying Query: '.$location.' --help<br>';
exec($location.' --help',$output) or die('Failed');

echo 'Result: '.implode($output)."<p>";

echo 'Trying Query: jbig2dec --help<br>';
exec('jbig2dec --help',$output) or die('Failed');

echo 'Result: '.implode($output)."<p>";

O resultado é:

Trying Query: whereis jbig2dec
Result: jbig2dec: /usr/local/bin/jbig2dec
Trying Query: /usr/local/bin/jbig2dec --help
Failed

Basicamente, você pode ver acima que a função exec do PHP funciona para whereis jbig2dec , mas falha para /usr/local/bin/jbig2dec --help . MAS se eu digitar /usr/local/bin/jbig2dec --help ou jbig2dec --help no SSH, obtenho a resposta correta do jbig2dec.

Como isso poderia ser?

    
por Alasdair 11.04.2013 / 11:06

1 resposta

4

Verifique o valor de retorno de /usr/local/bin/jbig2dec --help sobre SSH da seguinte forma:

$ /usr/local/bin/jbig2dec --help
[... generates some output ...]
$ echo $?

O último comando imprime o "valor de retorno" da chamada anterior. Um valor de retorno de 0 é "o modo de shell" de dizer "o comando executado com sucesso". Um valor de retorno de outra coisa indica um erro.

Se exec() encontrar um valor de retorno diferente de 0 (que alguns programas fornecem em mensagens de ajuda, já que o programa não foi executado tecnicamente), ele retornará "false" no contexto do PHP e, portanto, acionará o or die() parte e terminar o script PHP com a mensagem de erro dada.

Em palavras mais curtas: seu comando provavelmente não retorna um status bem-sucedido, e você disse ao PHP para die() se isso não acontecer.

    
por 11.04.2013 / 12:19