GitPython - 使用SSH密钥进行克隆 - 主机密钥验证失败

3


我在应用程序中克隆git仓库时遇到了问题。

KEY_FILE = "/opt/app/.ssh/id_rsa"

def read_git_branch(config_id, branch):
    config = RepoConfig.objects.get(id=config_id)
    save_rsa_key(Credentials.objects.get(id=1).key)
    git_ssh_identity_file = os.path.expanduser(KEY_FILE)
    git_ssh_cmd = 'ssh -i %s' % git_ssh_identity_file
    with Git().custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
        with tempfile.TemporaryDirectory() as tmpdir:
            repo = Repo.clone_from(config.url, tmpdir, branch=branch)
            branch_obj, _ = Branch.objects.get_or_create(name=branch)
            ....

def save_rsa_key(key):
    if not os.path.exists(os.path.dirname(KEY_FILE)):
        try:
            os.makedirs(os.path.dirname(KEY_FILE))
        except OSError as exc:
            if exc.errno != errno.EEXIST:
                raise
    with open(KEY_FILE, 'w') as id_rsa:
        id_rsa.write(key)
        os.chmod(KEY_FILE, 0o600)

期望的结果是将仓库克隆到临时目录,做一些操作然后删除所有文件。但实际得到的结果是:

[DEBUG/ForkPoolWorker-2] AutoInterrupt wait stderr: b'Host key verification failed.\nfatal: Could not read from remote repository.\n\nPlease make sure you have the correct access rights\nand the repository exists.\n'

git.exc.GitCommandError: Cmd('git') failed due to: exit code(128) cmdline: git clone --branch=master -v git@gitlab.foo:bar/project.git /tmp/tmpi_w2xhgt stderr: 'Host key verification failed.

当我尝试使用上面代码创建的密钥文件直接从计算机连接到相同的仓库时出现问题。
ssh-agent bash -c 'ssh-add /opt/app/.ssh/id_rsa; git clone git@gitlab.foo:bar/project.git'

存储库已成功克隆+主机已添加到known_hosts
完成此操作后,我的代码按预期工作...

这一定与known_hosts有关。 有人遇到过类似的问题吗?

感谢您的帮助。


1
这是一个安全特性。相关的内容请参考 how-to-add-hostname-to-known-hosts-using-pythonparamiko-add-host-key-to-known-hosts-permanently - stovfl
3个回答

3
你应该使用clone_from中的env。
with Git().custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
    repo = Repo.clone_from(config.url, tmpdir, branch=branch)

git.Repo.clone_from(url, repo_dir, env={"GIT_SSH_COMMAND": 'ssh -i /PATH/TO/KEY'})

这个回答应该得到更多的赞。我被另一个回答(在此处)误导了,它对于clone_from情况不起作用。 - Shadi

2
这个变量:
git.Repo.clone_from("git@bitbucket.org:user/coolrepo.git", r"..\coolrepo", env=dict(GIT_SSH_COMMAND="ssh -i id_rsa"))

对我来说运行良好!


0

虽然现有的答案涵盖了缺少SSH环境的情况,但我遇到了一种情况,远程主机密钥只能通过GitPython接受,并且无法修改环境以将该主机密钥包含在已知主机中。

为确保主机密钥不会破坏您的代码,请通过操作ssh命令禁用严格的主机密钥检查:

git.Repo.clone_from(
    url, 
    repo_dir, 
    env={
        "GIT_SSH_COMMAND": "ssh -o StrictHostKeyChecking=no -i /path/to/key"
    }
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接