PHP运行Git时出现“ssh权限被拒绝”的错误

6

我正在尝试从浏览器中运行一个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
)

谢谢


然后,在php中运行 exec('ssh -v git@assembla.com 2>&1', $output , $returnVar);

返回状态:255数组 ( [0] => OpenSSH_5.3p1,OpenSSL 1.0.0-fips 29 Mar 2010 [1] => 伪终端将不会分配,因为stdin不是终端。 [2] => debug1:读取配置数据/ etc / ssh / ssh_config [3] => debug1:应用于* [4] => debug1:连接到assembla.com [64.250.188.41]端口22。 [5] => debug1:连接到地址64.250.188.41端口22:拒绝访问 [6] => ssh:无法连接到主机assembla.com端口22:权限被拒绝 )
- user1554046
4个回答

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

您的Web服务器和PHP安装是否受到Suhosin、safe-mode、Apparmor或其他安全机制的保护?

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


1

Apache会以“nobody”用户身份运行脚本。您的脚本依赖于在~apache/.ssh/id_rsa存储的私钥。

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

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

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

在执行带或不带Ruby的shell命令时指定私有SSH密钥?

在这里查看作为不同用户运行的方法:

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

我不建议以nobody身份运行(因为此时nobody用户可以访问您的私钥),也不建议以apache身份运行(因为这样一旦发现站点漏洞,可能造成更大的损失)。因此,您应该创建一个具有最小权限的不同用户来读取您的私钥并执行git命令。如果您只是为此创建了一个受限制的用户帐户,并将密钥(公钥/私钥)放入~/.ssh中,则可能不需要指定密钥。

我认为这不是根本原因,因为错误是ssh在打开连接时给出了权限拒绝的错误。错误不是关于身份验证失败的。因此,我认为这是PHP中的其他权限问题或安全机制 - 请参见我的答案。 - gertvdijk
我认为这是真的。实际上,错误与ssh连接被拒绝的错误相似,但看起来存在某种沙盒以防止被利用的脚本进行外部连接。猜测关键的事情将是第二件出错的事情。 - jmh

0
这是一个权限问题吗?PHP脚本通常会以nobody用户运行,可能没有权限执行git命令。

请问,我该如何检查 PHP 运行的用户是哪个? - user1554046
这取决于PHP脚本的执行方式。如果脚本正在运行,您可以执行 ps aux | grep scriptName.php - thatidiotguy
或者只需 $var=exec("env", $output, &returnvar)。 - jmh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接