php运行git-get";ssh权限被拒绝";
我试图从浏览器中运行一个php脚本,但是我得到了 “sh:连接到主机git.assemblea.com端口22:权限被拒绝” 我的php脚本:php运行git-get";ssh权限被拒绝";,php,git,ssh,assembla,Php,Git,Ssh,Assembla,我试图从浏览器中运行一个php脚本,但是我得到了 “sh:连接到主机git.assemblea.com端口22:权限被拒绝” 我的php脚本: 谢谢这是权限问题吗?PHP脚本很可能以nobody用户的身份运行,而nobody用户可能没有运行git命令的权限。您的Web服务器和PHP安装是否由Suhosin、安全模式、Apparmor或其他安全机制强制执行 我建议您尝试使用PHP Git绑定,比如执行更多操作。该模块设计用于在PHP代码中使用Git。Apache将以“nobody”用户的身份运行脚
谢谢这是权限问题吗?PHP脚本很可能以nobody用户的身份运行,而nobody用户可能没有运行git命令的权限。您的Web服务器和PHP安装是否由Suhosin、安全模式、Apparmor或其他安全机制强制执行
我建议您尝试使用PHP Git绑定,比如执行更多操作。该模块设计用于在PHP代码中使用Git。Apache将以“nobody”用户的身份运行脚本。您的脚本依赖于私钥最有可能存储在~apache/.ssh/id\u rsa 失败的原因是git无法访问该密钥,并且无法对git服务器进行身份验证 解决方案是指定要使用的正确密钥,并使执行脚本的用户可以访问该密钥 请阅读以下内容,了解如何指定密钥: 在此处查看以不同用户身份运行的方法:
我不建议以nobody(因为nobody用户可以访问您的私钥)或apache(因为如果发现您的站点存在漏洞,您将增加可能造成的损害)的身份运行。因此,您应该创建一个具有最低权限的不同用户来读取您的私钥并执行git命令。如果您只是为此创建了一个有限的用户帐户,并将密钥(public/private)放入~/.ssh中,则可能不需要指定密钥这里有很多变量。。。但我在编写一个远程cgi脚本时遇到了几乎完全相同的行为 就我而言,这个问题与CentOS上的SELinux有关
user@remoteserver:~$getsebool-a | grep httpd
显示:
测试可能的修复程序(sudo或以root用户身份运行):
永久性修复(如果以上证明有效):
user@remoteserver:~$setsebool-P httpd\u can\u network\u connect=1
-p选项确保在将来重新启动时将subject SELinux布尔值设置为默认值。
见:
man getsebool
和
man-setsebool
对不起,我如何检查php作为哪个用户运行?这取决于php脚本的执行方式。如果脚本正在运行,您可以执行ps aux | grep scriptName.php
。或者只执行$var=exec(“env”、$output,&returnvar),我认为这不是根本原因,因为错误在于ssh在打开连接时拒绝了权限。该错误与身份验证失败无关。因此,我认为这是PHP的另一个许可问题或安全机制——见我的答案。我认为这是事实。我被这个错误与ssh连接拒绝错误的相似性吓坏了,但看起来存在某种沙箱来防止被利用的脚本进行外部连接。据猜测,关键的事情将是第二件出错的事情git@assembla.com2>&1',$output,$returnVar);--------------------------返回状态:255数组([0]=>OpenSSH_5.3p1,OpenSSL 1.0.0-fips 2010年3月29日[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:权限被拒绝)
<?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
)
...
httpd_can_network_connect --> off
...
user@remoteserver:~$ setsebool httpd_can_network_connect=1
//...then initiate your serverside script remotely