2

Windowsボックスで開発/テストのセットアップがあり、バックグラウンドプロセスの呼び出しをテストする必要があります。バックグラウンドサービスを実行するためのオプションのリストとしてhttp://www.somacon.com/p395.phpを使用しています。

これが私が実行しようとしているサンプルコードです:

$string = "PsExec.exe -d cmd /c \"mspaint\"";
echo $string;
exec($string, $data);

これは、コマンドラインに入力すると機能します。

私はWindowsで多くのexecを実行しようとはしていませんが、Linuxボックスに移動する前にローカルでテストできると便利です。

今、psexecが新しいウィンドウを開くという事実と関係があると思いますか?しかし、それを修正する方法がわかりません。

apacheまたはPHPエラーログは生成されず、ページが停止することはありません。これは、PHPの最大実行時間も上書きするようです。

4

6 に答える 6

1

編集:

これは完全に正しい答えではありません。コマンドがリモートマシンに存在しないことを最初に返し、次にローカルマシンで評価されるpsexec \\machine cmd.exe /C 1 & dirため、コマンドはハングしません。cmd演算子の順序にだまされました。オペレーターは、リモートプロセスではなく、ローカルプロセスで呼び出されています。ただし、次のコマンドを引用すると、ロジックは引き続き適用されます。psexec1dir&cmd.exepsexec \\machine cmd.exe /C "1 & dir"

元の回答:

WindowsのPHP内でpsexecを呼び出しているときに、何か奇妙なことが起こっています。shell_exec()、、、またはを使用しexec()ているかどうかは関係ありません。とにかくハングします。popen()proc_open()

正直なところ、何が起こっているのかわかりません。プロセスのコマンドラインや引数などをトレースするためにPsExplorerをダウンロードすることもできます。このツールは非常に便利です。

私はWindowsでXAMPPを使用していますが、特定のテストの結果、次のことがわかりました。

まず、テストファイル(つまりtest.php)を作成してWebサーバーに配置し、次のコンテンツでアクセスできるようにします。

   <?php
      echo "<pre>".shell_exec("psexec \\\\machine <options> cmd.exe /C dir")."</pre>";
   ?>

GETより柔軟な例を作成するために引数を使用できることに注意してください。Webページでテストする前に、これが実際に機能していることをデバンキングするには、コマンドを発行しphp <path-to-the-file>\test.phpます。それは完璧に機能します。ただし、Webブラウザでは機能しません。

プロセスを強制終了すると、最初の行が表示されますEl volumen de la unidad C no tiene etiqueta.。次の行、私の言語にはアクセントが含まれているので、エンコーディング(またはコードページ)の問題である可能性があると思いました。cmd.exe /C dirだから私がテストする代わりにcmd.exe /C chcp 850 && dir。驚いたことに、それは機能します。

次に、たとえば、前に設定したコマンドが何であっても機能することに気付きます(コマンド出力を評価していないのでcmd.exe /C 123 & dir、シングルに注意してください)。&

psexec正直なところ、 Webブラウザを介してPHPで何が起こっているのかわかりません。さらに驚くべきことに、コマンドは次のようcmd.exe /C copy cmd.exe cmd.exe.deletemecmd.exe /C mkdir deletethis機能します。

だから、あなたはそれcmd.exe /C 1 & \"mspaint\"をあなたの問題として試してみることができます、そして私は似ているようです。単一のコマンドの場合は回避策になる可能性がありますが、ソフトウェアをインストールするための無人フレームワークを開発しており、すべてのファイルは.cmdまたは.exeまたは.bat ファイルです。

何か面白いものを見つけたら教えてください:)

于 2013-06-07T19:08:34.187 に答える
1

私には解決策があります!

このトピックは古いですが、それでも関連性があります。PsExec2.2とPHP7.2.0RC3を使用して、スクリプトをリモートで実行したかったのです。スクリプトの出力が必要なので、で使用PsExec.exe -accepteula \\HOST -u xxx -p xxxしていまし>> LOGFILE 2>&1た。

スクリプトが終了するのを待ちたくないので、次のexec()ように使用しexec('start /p cmd /c PsExec.exe -accepteula \\HOST -u xxx -p xxx >> LOGFILE 2>&1')ました。私のphpスクリプトは引き続き機能し、PsExecも彼の仕事をします。

すべて正常に動作しますが、LOGFILE常にSTDOUT出力の最初の行のみが含まれています。

ここに記載されている多くの解決策を試しましたが、どれもうまくいきませんでした。コマンドをCMD直接実行すると、PsExecはのすべての行を返しますがSTDOUT、php内では返しません。

php docでexec()、何人かの人々がPsExecを使用して、待たずにプログラムを実行したというコメントを見つけました(http://php.net/manual/de/function.exec.php#86438)。最後のチャンスとして、私は次のことを試しました:exec('PsExec.exe -accepteula -i -d cmd /c PsExec.exe -accepteula \\HOST -u xxx -p xxx >> LOGFILE 2>&1')...そしてそれはうまくいきます!

PsExecはすべてを私のに返しますLOGFILE。私はあなたを助け、あなたの時間を節約できることを願っています。

于 2017-10-19T12:53:03.863 に答える
0

私の現在の解決策は、WScript.Shellを使用することでした。

$string = "cmd /c \"cd {$full_base}{$newSource} && ant release > compile.txt\"";
$Shell = new COM("WScript.Shell"); 
$exec = $Shell->Run($string, 0, false);
于 2013-06-07T18:45:36.173 に答える
0

これが明確に答えられたかどうかはわかりませんが、PSEXECがハングするという同じ問題が発生していましたが、私の場合、一部のマシンではそうであり、他のマシンではそうではありませんでした。EULAを受け入れていることが判明しました。コマンドラインから実行し、PHPスクリプトと 同じユーザー名/パスワードを使用したマシンでは、ハングすることなく実行されました。

さらなる調査により、PHPから実行されるコマンドにEULAの受け入れを含めることで、EULAの受け入れを指定できることがわかりました。

このDIDはハングします:psexec \\MACHINENAME ...

これはしませんでした: psexec /accepteula \\MACHINENAME ...

于 2013-10-15T17:11:02.647 に答える
0

わかりました、ここにあります。私もあなたと同じような状態に飛び込みました、そしてうまくいけば、私はこれについて遅くコメントしているので、あなたも方法を考え出したに違いありません。しかし、まだこの問題にある人のために、私は彼らにいくつかのヒントを提案します。
1)投稿されたコードは非常に細かく、問題ありません。ページが無限にハングアウトする場合は、ソースexeの前に-i-dパラメータを追加してみてください。(ここのドキュメントを参照してください)。コマンドに-accepteula(EULA)フラグを追加して、ページをロードし、そのコマンドが終了するのを待たないようにすることもできます(無限待機の問題を解決します)。
2)私にとってこれらのことはうまくいきませんでした。これは、皆さんがこれらのことを試さないという意味ではありません。これらは、コードが機能し始めた場合の最初のステップであり、それで問題ありません。それ以外の場合は、管理者として別のアカウントを作成し、スタートメニューにservices.mscと入力します。そこのページ。mysqldサービスを除くwampapacheまたはxammpサービスを検索します。次に、そのサービスをクリックします。[ログオン]タブに移動し、[このアカウント]を選択します。以前に作成したadmin accを選択し、設定した場合はパスワードを入力します。それ以外の場合は、テキストボックスを空のままにします。そのアカウントの名前を名前に\\accnameと入力します。分野 。アカウント名がわからない場合は、クリックして参照->詳細設定->今すぐ検索その名前のアカウントが表示されます。選択して設定を適用し、Wampアプリを再起動すると、準備が整います:)

于 2014-08-12T21:26:03.037 に答える
0

また、execコマンドに入力する文字列を再確認してください。些細なことのようですが、しばらくの間私を困惑させました。多くの場合、PHPは、マシンアドレスの二重円記号をエスケープしてすべてを破棄します。これを回避するには、次のような文字列を作成します。

$string = 'PSExec /accepteula \\\\MACHINENAME ...'
于 2014-10-14T20:56:59.227 に答える