0

我想写 web SSH 控制台,我发现了两个问题。

我想做的事。首先,我想执行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,因为新进程不记得我已登录。

窗户上的例子。

  1. cmd我在 PHP 中创建新进程 ( ),我的当前目录是C:\WebServ\.

在此处输入图像描述

  1. 我写cd /命令,我的当前目录是C:\.

在此处输入图像描述

这只是示例,我不想只更改目录,这对我来说不是问题。

问题是如何创建一个进程并在下一次 PHP 文件执行中访问它 -mysql例如,如果我想记住会话?

  1. 我可以按proc_open功能创建流程。
  2. 我可以通过 PID 获取 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 回答
0

这种非常天真的*方法怎么样:

1) 您的start.php脚本将轮询文件资源,例如/tmp/commands.in传入命令。当然,脚本只能在您的 PHP 设置max_execution_time允许的情况下执行此操作,因此请务必调用set_time_limit(0);以删除限制。如果在文件中找到命令,则脚本将通过其进程管道将其执行到cmdbash用作 shell 的任何内容,并将输出写入/tmp/commands.out.

2)command.php然后您将命令写入/tmp/commands.in并读取内容/tmp/commands.out并将其显示在浏览器中。

*) 天真,因为这种方法显然会带来并发性、安全性和可能的​​许多其他问题。所以这些问题必须通过使用文件锁、ACL 等来处理。

于 2015-03-26T22:32:39.337 回答
0

proc_open()返回资源类型。资源无法序列化,因此您无法将其保存以备后用。它们在脚本执行结束时被释放,持久数据库连接除外。

于 2015-03-20T13:24:57.917 回答