使用ssh的Php exec git pull脚本不起作用,但手动操作

时间:2017-08-03 19:23:37

标签: php git ssh

我正在尝试创建一个脚本,我可以在推送到Bitbucket存储库之后将Git拉到我的ubuntu服务器上。我已经为Bitbucket设置了ssh密钥,它可以在存储库上执行git pull命令,但是当我从php exec中尝试它时它不起作用。

我已经尝试了像/.ssh/bitbucket_rsa这样的chmod命令,如775和777以及chown -R www-data:www-data / .ssh,没有任何运气。

回应:

array (
 0 => 'Host key verification failed.',
 1 => 'fatal: Could not read from remote repository.',
 2 => '',
 3 => 'Please make sure you have the correct access rights',
 4 => 'and the repository exists.',
 )  

代码:

    public function gitPull() {
    try {
        exec("cd " . env("REPO_PATH") . " && git pull 2>&1", $output);
        Log::info($output);
    } catch (\Exception $e) {
        Log::error($e);
    }
    http_response_code(200);
}

3 个答案:

答案 0 :(得分:0)

我猜你会被用户www-data无法与git服务器建立SSH连接这一事实。我认为最简单的方法是为www-data用户创建一个主目录,并使用适当的权限,配置文件和密钥文件创建一个.ssh目录。您始终可以使用

以root身份测试设置
# su - www-data
$ cd <to your repository>
$ git pull

Google提供“无密码的SSH连接”以正确设置。并且还要注意,如果权限要松散,SSH拒绝使用密钥文件。

答案 1 :(得分:0)

Host key verification failed.

表示ssh无法验证主机密钥,很可能是因为www-data的home / .ssh目录中没有known_hosts文件,其中包含您的repo的预期主机密钥#39; s服务器。

至少有两种方法可以解决这个问题:

  • 使用ssh-keyscan as described over on Serverfault.se

    ssh-keyscan -H [hostname] >> /path/to/www-data's_home_directory/.ssh/known_hosts
    

    您只需要执行一次(除非密钥更改),但您应该在运行ssh-keyscan后检查密钥是否确实正确。

  • 在运行GIT_SSH_COMMAND之前设置git环境变量。您可以使用它来让ssh使用不同的known_hosts文件:

    export GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/path/to/known_hosts"
    

    请注意,上面假设是shell语法(例如Bash),您可能需要调整PHP,尤其是export GIT_SSH_COMMAND=部分。

答案 2 :(得分:0)

我在使用 github 时遇到了同样的问题:

ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
cat github-key-temp >> ~/.ssh/known_hosts
cat github-key-temp >> /etc/ssh/ssh_known_hosts

但这还不是全部,使用下一个命令您可以检查哪里出了问题(通过 exec 或 shell_exec 运行它(保存到一些日志中):

ssh -vT git@github.com 2>&1

因此,在 privious 命令的帮助下,我明白在我的情况下:cron 通过 php 脚本运行命令,但是在 ssh 连接期间它找不到我的密钥文件(我有该文件的自定义名称):

cd /etc/ssh/ssh_config.d/
sudo touch <some_name>.conf
sudo echo 'IdentityFile ~/.shh/<custom_key_file_name>' > <some_name>.conf

或者尝试将完整路径添加到您的密钥文件位置(~/ = 当前用户主目录)。 您可以通过运行检查 cron 用户,这有助于:

shell_exec('whoami');

附言我不知道这个解决方案是否足够安全。但我觉得还好。