很容易诊断出我遇到过的最困难的问题。我似乎无法打电话:
exec('call git pull', $output);
该过程会挂起,并倾向于使用IIS。
exec('call git status', $output); //works fine
这就是我所做的:
mysite/.git/
,Program Files/git/bin
和cmd.exe
2>NUL
和2>&1
显然,存在一个权限问题exec
调用cmd.exe
,而git.exe
又调用sh.exe
,后者又调用git-pull
连接到github,后者又使用git-send-pack
可能ssh-keygen
和GOD知道还有什么。
我猜'sh.exe'确定当前用户是IUSR,无法找到要通过身份验证的RSA密钥。
如果我能弄明白如何exec
IUSR帐户,我会尝试过。
如果我能弄明白如何cmd.exe
git bash而不是git(通过exec
),我会尝试过。
以下是最简单的问题:
如何通过PHP的{{1}}方法从我的github repo中提取?
这个问题肯定与SSH有关,但我完全在尝试的一切结束。
帮助!
答案 0 :(得分:14)
我今天遇到了同样的问题,并使用进程监视器查看发生了什么,并发现由于某些原因,sh.exe
在C:\Windows\SysWOW64\config\systemprofile\.ssh
中查找了密钥。所以我将C:\Users\Administrator\.ssh
中的所有内容复制到该文件夹中,并且完美无缺。
答案 1 :(得分:1)
有许多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
答案 2 :(得分:1)
我正在运行Windows Server 2012,但无法让Iamz的解决方案正常运行。
我在C:\
中搜索了“.ssh”,发现C:\Program Files (x86)\Git\.ssh
处有另一个.ssh文件夹。我将所有内容从C:\Users\Administrator\.ssh
复制到此文件夹,设置权限以允许IUSR访问,一切都是犹太教。
答案 3 :(得分:0)
您必须直接向cmd.exe授予权限。根据Windows的版本以及应用程序池设置的方式,可能是IIS_IUSR,IUSR和/或NETWORK SERVICE。将具有完全权限的用户添加到cmd.exe。
我当然不建议这样做,因为它有直接的安全隐患。也就是说,我还没有找到任何其他方法在Windows中实现它。
答案 4 :(得分:0)
您需要使用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()', '');
}
}
?>
答案 5 :(得分:0)
我能够通过遵循这里的许多内容来部分地完成这项工作。我运行了一个运行
的批处理脚本
ssh-agent -s
ssh-add -l
看看我有什么钥匙。在运行这些命令之前,我使用正确的ssh密钥将HOME=/c/Users/Username
环境变量设置为我的用户。 (我正在使用unix路径,因为我使用Git Bash运行它)
答案 6 :(得分:0)
我对窗户的环境不太了解
但主要问题是“.php文件”,调用exec命令没有管理员权限(或* NIX操作系统中的root)
在我的环境中,我知道该文件以root身份拥有权限(比如sudo) 另一种方法是创建具有权限777的新用户组,并将该文件分配给该用户的组
希望这个帮助
答案 7 :(得分:0)
我今天早些时候遇到过这个问题并以不同的方式解决了这个问题。
我的问题是IUSR没有将ssh密钥或git凭证文件放入的主文件夹。
我创建了一个.sh文件,在调用git之前更改了HOME变量,将我的密钥放在适当的位置就好像是它的主文件夹一样,然后用sh.exe运行.sh
#!/bin/bash
export HOME="/c/some/location"
git pull
答案 8 :(得分:0)
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文件
答案 9 :(得分:0)
将.ssh文件夹移至userprofile目录。您可以在此全局变量$ _SERVER [&#39; USERPROFILE&#39;]中看到您的应用配置文件目录。 就我而言,它是C:\ Windows \ system32 \ config \ systemprofile。 然后为用户提供读/写此文件夹(.ssh)的权限:IIS_IUSRS,IUSR