Linuxで実行されているサーバーで、12ノード(Linuxが実行されている12台のコンピューター)に対してコマンドを実行しています。最近、サーバーにPHPをダウンロードして、特定のPHPファイルを開いてコマンドを実行できるWebページを作成しました。
私が使用しexec()
、passthru()
、shell_exec()
、とsystem()
。system()
私のコードの一部を返す唯一のものです。PHPをLinuxでopen termainalコマンドのように動作させたいのですが、それを行う方法がわかりません!
これが現在起こっていることの例です(Linux対PHP):linux open terminalコマンドを直接使用する場合:
user@wizard:/home/hyperwall/Desktop> /usr/local/bin/chbg -mt
私は出力を取得します:
The following settings will be used:
option = mtsu COLOR = IMAGE = imagehereyouknow!
NODES = LOCAL
and additional code to send it to 12 nodes.
今PHPで:
switch($_REQUEST['do'])
{ case 'test':
echo system('/usr/local/bin/chbg -mt');
break;
}
出力:
The following settings will be used:
option = mtsu COLOR = IMAGE = imagehereyouknow!
NODES = LOCAL
そして止まる!誰かが何が起こっているのか説明がありますか?そしてそれを修正するには?システムのみがコードの一部を表示し、他の関数は何も表示しません!
私の最初の考えは、それがstdおよび出力エラーに関するものである可能性があるということです。一部のソフトウェアは、標準出力に関する情報と標準エラーに関する情報をダンプします。stdエラーをstd outにリダイレクトしない場合、ほとんどのシステムコールはstdout部分のみを返します。出力全体がターミナルに表示され、システムコールでは表示できないのは、そのためだと思います。だからと試して
/usr/local/bin/chbg -mt 2>&1
編集:一時的な作業でも、他のことを試すことができます。たとえば、出力をスクリプトの横のファイルにリダイレクトし、コマンドの実行後にその内容を読み取ります。これにより、execを使用できます。
exec("usr/local/bin/chbg -mt 2>&1 > chbg_out");
//Then start reading chbg_out and see is it work
Edit2また、他の人があなたのために働いていない理由も意味がありません。たとえば、cで書かれたこのコードは、文字列をstderrにダンプし、その他はstdoutにあります。
#include <stdio.h>
#include<stdlib.h>
int main()
{
fputs("\nerr\nrro\nrrr\n",stderr);
fputs("\nou\nuu\nuttt\n",stdout);
return 0;
}
そしてこのphpスクリプトは、execを介してそれを実行しようとします:
<?php
exec("/tmp/ctest",&$result);
foreach ( $result as $v )
{
echo $v;
}
#output ouuuuttt
?>
それでもstdoutが出力されることを確認してください。しかし、それはstderrを受け取りませんでした。これを検討してください:
<?php
exec("/tmp/ctest 2>&1",&$result);
foreach ( $result as $v )
{
echo $v;
}
//output: errrrorrrouuuuttt
?>
ご覧のとおり、今回は出力全体を取得しました。
今回はシステム:
<?php
echo system("/tmp/ctest 2>&1");
//output: err rro rrr ou uu uttt uttt
?>
等々 ...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加