我正在尝试从浏览器中运行php脚本中的git pull,但我得到了 “sh:connect to host git.assembla.com port 22:Permission denied”
<?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
)
由于
答案 0 :(得分: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 getsebool
和
man setsebool
答案 1 :(得分:1)
您的网络服务器和PHP安装是否由Suhosin,安全模式,Apparmor或其他安全机制强制执行?
如果您正在执行更多操作,我建议您尝试使用php-git之类的PHP-Git绑定。该模块设计用于在PHP代码中使用Git。
答案 2 :(得分:1)
Apache会将脚本作为“nobody”用户运行。您的脚本依赖于最有可能存储在~apache / .ssh / id_rsa
的私钥失败的是git无法访问该密钥,也无法对git服务器进行身份验证。
解决方案是指定要使用的正确密钥,并使正在执行该脚本的用户可以访问该密钥。
阅读本文以了解如何指定密钥:
Specify private SSH-key to use when executing shell command with or without Ruby?
在这里查看以不同用户身份运行的方法:
我不建议作为nobody运行(从那时起nobody用户可以访问你的私钥),或者作为apache(从那时起你就会增加在你的站点找到漏洞利用时可能造成的损害)。因此,您应该创建一个具有最小权限的其他用户来读取您的私钥并执行git命令。如果您只为此创建一个受限用户帐户并将密钥(公共/私人)放入〜/ .ssh
,则可能没有必要指定密钥。答案 3 :(得分:0)
这是权限问题吗? PHP脚本将作为最有可能的nobody用户运行,它可能没有运行git命令的权限。