編集:
これは完全に正しい答えではありません。コマンドがリモートマシンに存在しないことを最初に返し、次にローカルマシンで評価されるpsexec \\machine cmd.exe /C 1 & dir
ため、コマンドはハングしません。cmd演算子の順序にだまされました。オペレーターは、リモートプロセスではなく、ローカルプロセスで呼び出されています。ただし、次のコマンドを引用すると、ロジックは引き続き適用されます。psexec
1
dir
&
cmd.exe
psexec \\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.deleteme
にcmd.exe /C mkdir deletethis
機能します。
だから、あなたはそれcmd.exe /C 1 & \"mspaint\"
をあなたの問題として試してみることができます、そして私は似ているようです。単一のコマンドの場合は回避策になる可能性がありますが、ソフトウェアをインストールするための無人フレームワークを開発しており、すべてのファイルは.cmd
または.exe
または.bat
ファイルです。
何か面白いものを見つけたら教えてください:)