php运行git得到“ssh Permission denied”

时间:2012-09-11 13:22:40

标签: php git ssh assembla

我正在尝试从浏览器中运行php脚本中的git pull,但我得到了 “sh:connect to host git.assembla.com port 22:Permission denied”

我的php脚本

<?php
$output=array();
$returnVar=0;
chdir("/var/www/html");
exec('git pull git@git.assembla.com:andrewadel.git master 2>&1', $output , $returnVar);
// exec('pwd', $output , $returnVar);
echo "<pre>\n";
echo "return status: $returnVar\n\n";
print_r($output);
echo "</pre>\n";

当我手动将脚本作为“apache”运行时,一切都很好

bash-4.1$ whoami
apache
bash-4.1$ php gitsync.php
<pre>
return status: 0

Array
(
    [0] => From git.assembla.com:andrewadel
    [1] =>  * branch            master     -> FETCH_HEAD
    [2] => Already up-to-date.
)
</pre>

当我从浏览器运行时,它失败

http://103.7.164.33/gitsync.php?111

return status: 1

Array
(
    [0] => ssh: connect to host git.assembla.com port 22: Permission denied
    [1] => fatal: The remote end hung up unexpectedly
)

由于

4 个答案:

答案 0 :(得分:4)

这里有很多变量......但我正在处理与我正在处理的远程cgi脚本完全相同的行为。

就我而言,问题与CentOS上的SELinux有关。

user@remoteserver:~$ getsebool -a | grep httpd

示:

...
httpd_can_network_connect --> off
...

测试可能的修复(sudo或以root身份运行):

user@remoteserver:~$ setsebool httpd_can_network_connect=1
//...then initiate your serverside script remotely

永久修复(如果上述证明有效):

user@remoteserver:~$ setsebool -P httpd_can_network_connect=1

-P选项确保主题SELinux布尔值在将来重新启动时设置为默认值。 看到: man getseboolman setsebool

答案 1 :(得分:1)

您的网络服务器和PHP安装是否由Suhosin,安全模式,Apparmor或其他安全机制强制执行?

如果您正在执行更多操作,我建议您尝试使用php-git之类的PHP-Git绑定。该模块设计用于在PHP代码中使用Git。

答案 2 :(得分:1)

Apache会将脚本作为“nobody”用户运行。您的脚本依赖于最有可能存储在~apache / .ssh / id_rsa

的私钥

失败的是git无法访问该密钥,也无法对git服务器进行身份验证。

解决方案是指定要使用的正确密钥,并使正在执行该脚本的用户可以访问该密钥。

阅读本文以了解如何指定密钥:

Specify private SSH-key to use when executing shell command with or without Ruby?

在这里查看以不同用户身份运行的方法:

https://serverfault.com/questions/226374/how-to-run-php-files-as-another-user-with-apache-and-fastcgi

我不建议作为nobody运行(从那时起nobody用户可以访问你的私钥),或者作为apache(从那时起你就会增加在你的站点找到漏洞利用时可能造成的损害)。因此,您应该创建一个具有最小权限的其他用户来读取您的私钥并执行git命令。如果您只为此创建一个受限用户帐户并将密钥(公共/私人)放入〜/ .ssh

,则可能没有必要指定密钥。

答案 3 :(得分:0)

这是权限问题吗? PHP脚本将作为最有可能的nobody用户运行,它可能没有运行git命令的权限。