php运行git得到“ssh Permission denied”

php run git got “ssh Permission denied”

我试图从浏览器运行git pull-in-php脚本,但是"sh:连接到主机git.assembly.com端口22:权限被拒绝"

我的PHP脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$output=array();
$returnVar=0;
chdir("/var/www/html");
exec('git pull [email protected]:andrewadel.git master 2>&1', $output , $returnVar);
// exec('pwd', $output , $returnVar);
echo"[cc lang="php"]
"
;
echo"return status: $returnVar

"
;
print_r($output);
echo"

’;< /代码> 当我手动运行脚本为"apache"时,一切都很好

1
2
3
4
5
6
7
8
9
10
11
12
bash-4.1$ whoami
apache
bash-4.1$ php gitsync.php
[cc lang="php"]
return status: 0

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

< /代码> 当我从浏览器运行它时,它失败了

1
2
3
4
5
6
7
8
9
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
)

谢谢


这里有很多变量…但是我在使用一个我正在开发的远程CGI脚本时遇到了几乎完全相同的行为。

在我的案例中,这个问题与Centos上的Selinux有关。

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

显示:

1
2
3
...
httpd_can_network_connect --> off
...

测试可能的修复(sudo或以根目录运行):

1
2
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


Apache将以"无人"用户的身份运行脚本。您的脚本依赖于将私钥最有可能存储在~apache/.ssh/id_rsa。

失败是Git无法访问该密钥,并且无法通过Git服务器进行身份验证。

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

阅读此内容了解如何指定密钥:

指定在执行带Ruby或不带Ruby的shell命令时要使用的专用ssh密钥?

请在此处查看以不同用户身份运行的方法:

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

我不建议以无人身份运行(从那时起,无人用户可以访问您的私钥),也不建议以Apache身份运行(从那时起,如果发现您的站点存在漏洞,您将增加可能造成的损害)。因此,您应该创建一个具有最小权限的不同用户来读取您的私钥并执行git命令。如果只是为此创建一个有限的用户帐户并将密钥(public/private)放入~/.ssh,则可能不需要指定密钥。


您的Web服务器和PHP安装是否由suhosin、安全模式、apparmor或其他安全机制强制执行?

如果您要做更多的操作,我建议您尝试php-git绑定,比如php-git。该模块是为使用PHP代码中的Git而设计的。


这是权限问题吗?PHP脚本很可能以nobody用户的身份运行,而nobody用户可能没有运行git命令的权限。