编辑:
这不是完全正确的答案。该命令psexec \\machine cmd.exe /C 1 & dir
不会挂起,因为psexec
首先返回说该命令1
在远程计算机中不存在,然后dir
在本地计算机中进行评估。我被 cmd 运算符命令欺骗了。&
操作员在本地进程中被调用,而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
参数来创建更灵活的示例。要在您测试网页之前揭穿这确实有效,请发出命令php <path-to-the-file>\test.php
。这将完美地工作。但是,它不适用于网络浏览器。
如果你终止进程,你会得到第一行: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
通过网络浏览器使用 PHP 发生了什么。更令人惊讶的是,命令喜欢cmd.exe /C copy cmd.exe cmd.exe.deleteme
并且cmd.exe /C mkdir deletethis
会起作用!
因此,您可以尝试一下,cmd.exe /C 1 & \"mspaint\"
因为您的问题和我的问题相似。对于单个命令可能是一种解决方法,但我正在开发一个用于安装软件的无人值守框架,并且我的所有文件都是.cmd
或.exe
或.bat
文件。
让我知道如果你发现了一些有趣的东西:)