0

Web SSH コンソールを作成したいのですが、2 つの問題が見つかりました。

私がしたいこと。まずstart.php、次のコードを含むファイルを実行します。

$process = proc_open('start', array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("pipe", "a")
), $pipes);

次に、ファイルcommand.php内に作成されたプロセスでコマンドを実行しstart.php、そこから結果を取得するファイルを実行します。

$pid = 12345;
print_r(process_command('ping google.com', $pid));

cmd過去に作成したプロセス ( ) にアクセスし、コマンドを送信して結果を取得したいだけです。

実行ごとに新しいプロセスを作成できるのに、なぜこれが問題なのcommand.phpですか? 新しいプロセスは新しいセッションであるため、過去command.phpの実行で mysql にログインすると、次の実行で再度 mysql にログインする必要があります。新しいプロセスはログに記録されたことを覚えていないためです。

Windows での例。

  1. cmdPHP で新しいプロセス ( ) を作成します。現在のディレクトリはC:\WebServ\です。

ここに画像の説明を入力

  1. コマンドを書きます。cd /現在のディレクトリはC:\.

ここに画像の説明を入力

これは単なる例です。ディレクトリを変更したくないだけです。これは私にとっては問題ではありません。

mysql問題は、1 つのプロセスを作成し、次の PHP ファイルの実行でそれにアクセスする方法です。たとえば、セッションを記憶したい場合は?

  1. 機能ごとにプロセスを作成できますproc_open
  2. でPIDを取得できますがget_process_status、現在のPHPファイルが実行される前に作成されたプロセスリソースを取得するにはどうすればよいですか?

そして次の質問ですが、過去に作成したプロセスにアクセスできる場合、作成したプロセスに新しいコマンドを書き込む方法を教えてください。

PHP拡張機能を使用したくありません。ただし、この場合にこれが必要な場合は、それぞれの回答が役に立ちます。

他の PHP 実行で作成されたプロセスにアクセスできない場合はwhile(1)、PHP 実行の開始時に作成されたプロセスを制御するために使用したいのですが、この場合は必要ないことを願っています。 次に、作成されたプロセスに新しいコマンドを書き込む方法を誰かが知っていることを願っていcmdます。


私の質問の解決策に問題がある場合は、cmd.exeによって開かれたプロセスにコマンドを送信するshell_exec方法と、各コマンドの応答を受信する方法を教えてくれる回答を受け入れます。

4

3 に答える 3

0

私はあなたが今求めていることを理解していると思います。これを試して:

<?php
$fd = array(
0 => array("pipe", "r"),  // stdin
1 => array("pipe", "w"),  // stdout
2 => array("file", "error.txt", "a") // stderr
);

$process = proc_open("cmd.exe", $fd, $pipes);

echo "Welcome to this interactive CMD shell. Please type your commands below\n";
while(is_resource($process) {
  $input = readline(); //Get user input
  $input .= "\n";      //Need newline to press ENTER on CMD

  if($input == "exit\n") {

    fwrite($pipes[0], $input);
    break; //End BOTH this program AND cmd
  }

 fwrite($pipes[0], $input);
}

fclose($pipes[0]);
echo file_get_stream($pipes[1]); //print all the output from CMD

//Cleanup
fclose($pipes[2]);
proc_close($process); //Should already be closed!

STDIN ($pipes[0]) を閉じるまで、子からデータを取得できないことに注意してください。つまり、コマンドの送信が完了するまで、子の出力を取得できません。

于 2015-03-26T09:39:28.200 に答える