6

我正在尝试从浏览器运行 git pull 的 php 脚本,但我得到“sh:连接到主机 git.assembla.com 端口 22:权限被拒绝”

我的 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

4 回答 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

于 2012-09-19T06:40:24.070 回答
1

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

如果您要进行更多操作,我建议您尝试像php-git这样的 PHP-Git 绑定。该模块设计用于在 PHP 代码中使用 Git。

于 2012-09-11T13:31:10.140 回答
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,则可能不需要指定密钥

于 2012-09-11T13:59:53.723 回答
0

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

于 2012-09-11T13:23:57.137 回答