我试图从浏览器中的PHP脚本运行git拉,但我得到了“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";
当我手动运行该脚本作为“阿帕奇”,一切都很好
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
)
谢谢
很多人在这里变量...但我面对的是一个远程CGI脚本我工作几乎完全一样的行为。
在我的情况下,问题涉及到了SELinux在CentOS。
user@remoteserver:~$ getsebool -a | grep httpd
结果显示:
...
httpd_can_network_connect --> off
...
测试可能的修复(须藤或以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 getsebool
和man setsebool
是您的网络服务器和PHP安装通过了Suhosin,安全模式,AppArmor的或其他安全机制执行呢?
我建议您尝试PHP-的Git绑定像PHP的混帐如果你正在做更多的操作。 该模块是专为PHP代码中使用Git工作。
阿帕奇将作为“人”的用户运行该脚本。 您的脚本依赖于拥有的私有密钥最有可能保存在〜阿帕奇/的.ssh / id_rsa
失败是git的不能访问密钥,不能对自己的git的服务器进行身份验证。
解决的办法是指定正确的键使用,使该密钥访问正在执行脚本的用户。
阅读本关于如何指定密钥:
指定的私人SSH密钥执行带或不带红宝石shell命令时使用?
看看这里的方法来运行为不同的用户:
https://serverfault.com/questions/226374/how-to-run-php-files-as-another-user-with-apache-and-fastcgi
我不会推荐运行的人(因为那么nobody用户访问你的私钥),或作为阿帕奇(从那以后你都在增加可以做应该的漏洞为您的网站中发现的损坏)。 因此,你应该创建一个具有最小权限的不同的用户阅读你的私钥和执行git的命令。 它可能没有必要指定键,如果你只是为此创建受限用户帐户,并把密钥(公钥/私钥)到的〜/ .ssh
这是一个权限问题? 一个PHP脚本将作为nobody用户最有可能的,这可能没有权限运行的git命令运行。