2017-01-14 4 views
1

1でまず者は、端子を介してコマンドを実行してみましょう:php - shell_exec、execなどは端末のように出力できません。でも2>&

$ echo 1; /etc/init.d/apache3 restart; echo 2; 

結果..

1 
bash: /etc/init.d/apache3: No such file or directory 
2 

かっこいい(わざとapache3がエラーを参照してください)。 1 2

私はあらゆる種類のものを試してみました:

今、私はブラウザ上で見るすべてがある

<?php 

$command = "echo 1; /etc/init.d/apache3 restart; echo 2; 2>&1"; 
$response = shell_exec("$command"); 
echo $response; 

?> 

..さんは、PHPを経由して、これを実行してみましょう。 のようなすべてのPHPのものを試してみました..「& &」とセミコロンを置き換え..

passthru() 
exec() 
system() 
popen() 

私はかなりそれをすべて試してみました。私はターミナル経由で見るものと同じものを私に見せることはできません。もしくはshell_execのマニュアルから

答えて

0

:ALSO

、(それはshell_execに注意してください)がSTDERRをつかむので、STDOUTにリダイレクトし、それをキャッチ に "2> & 1" を使用していません。

1

あなたは、再起動コマンドの後に2> & 1を使用する必要が

あなたのコマンド:

$command = "echo 1; /etc/init.d/apache3 restart; echo 2; 2>&1"; 

あなたは何を使用していない最後に "2> & 1" を持っています。

また、あなたはケースの他の各コマンドの後2> & 1に追加されますSTDERR

$command = "echo 1; /etc/init.d/apache3 restart 2>&1; echo 2 "; 
1

が幹部を使用することを検討して使用しています。基底関数は、出力の最初の行を返す:

$response = exec("$command"); // just the first line 

しかしとして、また(配列として)出力と戻り値

$retval = NULL; 
$output = NULL; 
$response = shell_exec("$command", $output, $retval); // last two params are passed by reference and modified by the command 

両方をキャプチャするために追加のパラメータを使用しますuser993553が掲載されている場合、PHPでこれらのcli関数によってキャプチャされた出力は、通常stdoutではなくstdoutを返します。 stderrを出力にルーティングするために、任意のコマンド(2の前のスペースに注意してください)に "2> & 1"を追加することができます。

$command = "echo 1; /etc/init.d/apache3 restart 2>&1; echo 2;"; 
$retval = NULL; 
$output = NULL; 
$response = exec($command, $output, $retval); 
var_dump($output); 

と出力:

array(3) { 
    [0] => 
    string(1) "1" 
    [1] => 
    string(37) "sh: 1: /etc/init.d/apache3: not found" 
    [2] => 
    string(1) "2" 
} 

EDIT:あなたはまた、エラー状態のための$ RETVALを確認することができます。あなたの関数になる、と述べた

空でもゼロでもない場合は、エラーを示します。

関連する問題