我正在尝试创建一个脚本,我可以在推送到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);
}
答案 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');
附言我不知道这个解决方案是否足够安全。但我觉得还好。