【问题标题】:PHP exec on a Windows with IIS configuration具有 IIS 配置的 Windows 上的 PHP exec
【发布时间】:2014-02-06 20:41:35
【问题描述】:

所以我已经阅读了大约 10 个答案,每个人似乎都提出了由于某种原因不起作用的想法。

我正在尝试执行一个简单的命令行,它是“svn update”,但它不工作,它返回 NULL

所以我已经尝试过反复试验的方式,现在这就是我可以说的;

我已经尝试了几个命令,例如

<?php
exec ("cmd /c ping 127.0.0.1 -n 1 > results.txt ");
?>

<?php
exec ("cmd /c chdir > results.txt ");
?>

两者都有效..事实上 chdir 表示执行该行的 php 文件存储在 pc 上的确切位置..

所以现在的问题是,为什么有些命令是这样的:

<?php
exec ("cmd /c dir > results.txt ");
?>

不工作?即使在文件夹中我有多个文件和目录,此结果和空值也是如此。

以及为什么如果我使用命令提示符移动到存储 php 文件的文件夹并键入 svn update 它可以正常工作

<?php
exec ("cmd /c svn update > results.txt ");
?>

返回 NULL?

非常感谢任何帮助。

感觉由于配置设置我有一些限制,因为当我尝试在本地使用 apache 时,我可以让大部分命令工作(shell_exec、system、exec,即使没有 cmd /c)

【问题讨论】:

  • 所以,当您从 php exec 函数运行 'cmd /c svn update > result.txt' 命令时,它不起作用。如果你自己从控制台运行它,它可以工作吗?
  • 是的,完全正确.. 但是如果从控制台运行 dir 命令,我也会遇到同样的问题,它会给我正确的输出。而例如 ping 和 chdir 给出相同的结果
  • 如果你绕道创建一个 .bat 文件并让 php 运行该文件而不是 'svn up' 命令呢?
  • 这是我一整天都在尝试的..我也尝试了同样的事情,但没有任何改变..执行一些命令但不是 dir 不是 svn

标签: php windows iis exec


【解决方案1】:

好的。

我已经设法解决了这个问题..

这就是我所做的:

首先检查特定网站正在运行的用户名。这样做:

<?php 
$out = array();
exec('cmd /c whoami 2>&1',$out,$exitcode);
echo "<br />EXEC: ( exitcode : $exitcode )";
echo "<hr /><pre>";
print_r($out);
echo "</pre>";
?>

这将返回计算机名,后跟用户名..

现在在运行网络服务器的计算机上运行

control userpasswords2

并赋予 whoami 说的用户名管理员权限

这将允许您最终使用 exec 或 system_exec 运行您想要的任何命令


另一方面,继续使用我的 SVN 命令,我发现我遇到了另一个问题,即当您运行它时,它会查找管理员帐户下的配置文件,并会给出错误提示:

svn: E125001: Can't determine the user's config path

要解决此问题,您只需在命令中指定 config_dir 即可:

exec('cmd /c svn update --config-dir C:\Users\Administrator\AppData\Roaming\Subversion C:\\inetpub\\vhosts\\websitename\\httpdocs\\folder 2>&1',$out,$exitcode);

希望这可以帮助遇到像我一样的问题的其他人!

【讨论】:

  • 我很不高兴我不得不为此用户授予管理员权限。不幸的是,这是让它工作的唯一方法:(但是,感谢您的解决方案
  • 我有类似的问题,我不能在服务器上使用:Windows Server 2012 R2, IIS 8, PHP Version 5.6.12 exec() 命令。我有一个 pdftotext 程序,可以将 PDF 转换为 TXT 并将结果写入文件,但 exec 返回错误 1,因为用户 IUSR_ANONYMOUSUSER 没有访问 CMD 的权限。我们已经测试了 AppPool 用户,但它在那里不起作用并给出了 FORK 错误。
【解决方案2】:

这可能是系统用户权限问题。我试过你的例子:

<?php exec ("cmd /c dir > results.txt "); ?>

在我安装了 Xampp 的 Windows7 上,它运行得非常好。但是,对于 IIS,“用户”可能没有对目录的权限,我认为它可能是系统用户 IIS-IUSR 或类似的东西。

这是一个可能有助于 IIS 用户权限的链接:http://www.iis.net/learn/get-started/planning-for-security/understanding-built-in-user-and-group-accounts-in-iis

【讨论】:

  • 我也认为这是一个权限问题,但除了授予 IISUSR 的完全访问权限 (777) 之外,我不知道我还能做什么。我没有从你给我的链接中找到任何进一步的帮助,抱歉
  • @user889030 你读过我的回答吗?显然不是..
【解决方案3】:

好的,根据你的回答,我认为你应该试试这个:

使用 'svn.exe' 可执行文件执行您的命令(替换 [[存储位置]])。 您的客户端可能有另一个 svn.exe 位置,但您必须自己弄清楚:)

exec('cmd /c "c:\\Program Files\\TortoiseSVN\\bin\\svn.exe" up "[[repository location]]"');

现在发生了什么?

exec中还有第二个参数,也许你也应该看看那个。

【讨论】:

  • 感谢您的提示!因为我没有安装 tortoisesvn 命令行,所以我正在使用 sliksvn .. 我尝试将此作为命令: test.txt'); ?> 但它会生成一个空的 txt 文件,而在 .bat 文件中表示已更新到修订版 x
  • 在等待适当的解决方案时,我在 Windows 2k8 上添加了一个自动操作,以便它每小时启动 bat 文件,该文件开始工作,我正在解析 result.txt,以便我知道源是否已更新.. 可能会暂时坚持这个解决方案,直到我不知道如何直接从 php 运行 cmd
【解决方案4】:

唯一对我有帮助的是,完成路线:

        $template_file = "C:/archivos/archivos.tex"
        $cmd = sprintf("C:/texlive/2020/bin/win32/pdflatex.exe " .$template_file );
        $result = exec($cmd, $output, $a);

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多