【问题标题】:git pull via PHP exec IISgit pull 通过 PHP exec IIS
【发布时间】:2011-12-28 08:34:11
【问题描述】:

这是我遇到过的最难诊断的问题。我好像打不通:

exec('call git pull', $output);

进程挂起并倾向于使用 IIS。

exec('call git status', $output); //works fine

这是我所做的:

  • 生成的 RSA 密钥添加到 github(密码为空)
  • 每个人都拥有mysite/.git/Program Files/git/bincmd.exe 的权限
  • 尝试了其他帖子中提到的 ssl 证书修复,但存在“斜线”问题
  • 尝试使用 https:// 而不是 SSH
  • 尝试通过管道连接到 stderr 2>NUL2>&1

显然,存在权限问题,exec 调用 cmd.exe,后者又调用 git.exe,后者又调用 sh.exe 连接到 github,而 github 又使用 git-pull 和可能的 @987654333 @and 上帝知道还有什么。

我猜 'sh.exe' 确定当前用户是 IUSR 并且找不到用于身份验证的 RSA 密钥。

如果我能弄清楚如何ssh-keygen IUSR 帐户,我会尝试的。

如果我能弄清楚如何使用exec git bash 而不是 git(通过cmd.exe)我会尝试的。

这是最简单形式的问题:

如何通过 PHP 的 exec 方法从我的 github 存储库中提取?

问题似乎出在 SSH 上,但我完全没有办法尝试。

救命!

【问题讨论】:

  • 您为什么只使用call git pull 而不是git pull
  • 调用只是使用 exec() 作为读取它的“推荐”方法 - 我已经尝试了这两种方法,但没有发现明显的区别
  • 我很肯定您在写权限方面遇到了问题。如果您考虑一下 git status 与 git pull 之间的区别。一个显示有关存储库的信息,而另一个实际进行文件系统级别的更改。
  • 是的,这似乎是一个权限问题,但正如问题所述,我尝试了我能想象到的最宽松的权限,但无济于事。

标签: php git ssh exec pull


【解决方案1】:

我今天遇到了同样的问题,并使用进程监视器查看发生了什么,发现由于某些原因sh.exeC:\Windows\SysWOW64\config\systemprofile\.ssh 中查找密钥。所以我将C:\Users\Administrator\.ssh 中的所有内容都复制到了该文件夹中,并且效果很好。

【讨论】:

  • 赢家!我还必须为此目录提供明确的权限,但它实际上是有效的。创造了奇迹,挽救了一天,世界变得更美好,获得了赏金。
  • 虽然这没有回答我的问题,但它为我指明了正确的方向,我认为它值得赏金 ;-)
  • 你是怎么发现的?
  • 我还想补充一点,在新创建的文件夹工作之前,您必须授予 IUSR 读取权限:)
  • 我还要补充一点,您应该生成您的密钥,从服务器拉一次并接受已知主机消息,然后将所有文件复制到上述文件夹并设置 IUSR 的权限新 .ssh 文件夹上的用户。
【解决方案2】:

我正在运行 Windows Server 2012,但无法让 Iamz 的解决方案正常工作。

我在C:\ 中搜索“.ssh”,发现C:\Program Files (x86)\Git\.ssh 中还有另一个 .ssh 文件夹。我将C:\Users\Administrator\.ssh中的所有内容都复制到了这个文件夹中,设置了允许IUSR访问的权限,一切都是kosher。

【讨论】:

  • 不适合我,我可以做 git status 但不能做 git pull
【解决方案3】:

有许多 php git 库/工具。 https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#git-php

就我个人而言,我一直在使用 GLIP(php 中的 git 库)http://fimml.at/#glip

我在 github 上有一个源代码叉,我在其中添加了一个存档功能。 基本上我动态地创建一个 git 命令并使用 php 的 passthru 方法来调用它。 也许查看我的代码可能会给您一些见解。这是提交 https://github.com/fontvirus/glip/commit/89127f7f9a4dc61697929f36684533406f348ffe

【讨论】:

    【解决方案4】:

    将您的 .ssh 文件夹移动到 userprofile 目录。您可以在此全局变量 $_SERVER['USERPROFILE'] 中看到您的应用配置文件目录。 在我的情况下,它是 C:\Windows\system32\config\systemprofile。 然后授予用户读取/写入此文件夹 (.ssh) 的权限:IIS_IUSRS, IUSR

    【讨论】:

      【解决方案5】:

      您必须直接授予 cmd.exe 权限。根据 Windows 的版本和您设置应用程序池的方式,它可能是 IIS_IUSR、IUSR 和/或 NETWORK SERVICE。将具有完全权限的用户添加到 cmd.exe。

      我当然不建议这样做,因为它会直接影响安全。也就是说,我还没有找到任何其他方法可以在 Windows 中实现它。

      【讨论】:

        【解决方案6】:

        您需要使用proc_open,因此会看到最有可能与权限相关的问题。

        这是script I use

        <?php
        
        //error_reporting(E_ALL);
        ignore_user_abort(true);
        
        function syscall ($cmd, $cwd) {
            $descriptorspec = array(
                1 => array('pipe', 'w'), // stdout is a pipe that the child will write to
            );
            $resource = proc_open($cmd, $descriptorspec, $pipes, $cwd);
            if (is_resource($resource)) {
                $output = stream_get_contents($pipes[1]);
                fclose($pipes[1]);
                proc_close($resource);
                return $output;
            }
        }
        
        // GitHub will hit us with POST (http://help.github.com/post-receive-hooks/)
        if (!empty($_POST['payload'])) {
        
            // pull from master
            $result = syscall('git pull', '/var/www/example.com');
        
            // send us the output
            mail('team@example.com', 'GitHub hook `git pull` result', $result);
        
            // clear APC
            if (apc_clear_cache('opcode') == false) {
                mail('root', 'Unable to apc_clear_cache()', '');
            }
        
        }
        
        ?>
        

        【讨论】:

        【解决方案7】:

        通过遵循这里的很多内容,我能够部分实现这一点。我运行了一个批处理脚本

        ssh-agent -s
        ssh-add -l

        看看我有什么钥匙。在运行这些命令之前,我使用正确的 ssh 密钥为我的用户设置了 HOME=/c/Users/Username 环境变量。 (我使用的是 unix 路径,因为我使用 Git Bash 运行它)

        【讨论】:

          【解决方案8】:

          我不太确定window的环境

          但主要问题是调用 exec 命令的“.php 文件”没有管理员权限(或 *NIX os 中的 root)

          在我的环境中,我将该文件设置为具有 root 权限(如 sudo 的东西) 另一种方法是创建具有权限 777 的新用户组并将该文件分配给该用户的组拥有

          希望有帮助

          【讨论】:

            【解决方案9】:

            我今天早些时候遇到了这个问题,并以不同的方式解决了它。

            我的问题是 IUSR 没有用于放置 ssh 密钥或 git 凭据文件的主文件夹。

            我创建了一个 .sh 文件,在调用 git 之前更改了 HOME 变量,将我的密钥放在适当的位置,就好像那是它的主文件夹一样,然后使用 sh.exe 运行 .sh

            #!/bin/bash
            export HOME="/c/some/location"
            git pull
            

            【讨论】:

              【解决方案10】:

              Iamz 解决方案的另一个变体是使用目录C:\Windows\System32\config\systemprofile\.ssh

              我通过在我的 IIS 服务器上运行以下脚本来实现这一点,它立即表明 C:\Windows\System32\config\systemprofile\.ssh 丢失(请根据您的机器设置 $path_of_git 和 $path_to_repo):

              <?php
              $descriptorspec = array(
                 0 => array("pipe", "r"),  // stdin
                 1 => array("pipe", "w"),  // stdout
                 2 => array("pipe", "w"),  // stderr
              );
              $path_of_git = 'c:\\path\\to\\git';
              $path_to_repo = 'C:\\inetpub\\repo';
              $process = proc_open($path_of_git.' fetch', $descriptorspec, $pipes, $path_to_repo, null);
              $stdout = stream_get_contents($pipes[1]);
              fclose($pipes[1]);
              echo '<pre>'.htmlspecialchars($stdout).'</pre>';
              $stderr = stream_get_contents($pipes[2]);
              fclose($pipes[2]);
              echo '<pre style="color:red;">'.htmlspecialchars($stderr).'</pre>';
              echo '<p>return value=' . proc_close($process) . '</p>';
              ?>
              

              话虽如此,我仍然被权限问题所困扰,所以我发现在每个 git 命令之前声明 HOME 是IUSR可以轻松到达的其他地方很有用,并执行整个事情用 git sh。例如:

              \pathToGit\bin\sh -c "export HOME='/c/somewhereIUSRCanGetTo/';git fetch"

              其中C:\somewhereIUSRCanGetTo\.ssh\ 包含私钥和 allowed_hosts 文件

              【讨论】:

                猜你喜欢
                • 2012-05-28
                • 1970-01-01
                • 2012-08-05
                • 2020-08-14
                • 2021-10-31
                • 2015-07-08
                • 1970-01-01
                • 2020-03-25
                • 1970-01-01
                相关资源
                最近更新 更多