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

时间:2018-10-01 14:05:41

标签: python git gitpython


我在应用程序中克隆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等待stderr:b'主机密钥验证失败。\ n致命:无法从远程存储库读取。\ n \ n请确保您具有正确的访问权限\ n并且该存储库存在。\ n '

     

git.exc.GitCommandError:Cmd('git')失败归因于:退出代码(128)         cmdline:git clone --branch = master -v git@gitlab.foo:bar / project.git / tmp / tmpi_w2xhgt         stderr:“主机密钥验证失败。

当我尝试直接通过具有以上代码通过以下代码创建的密钥文件从计算机连接到同一存储库时:

ssh-agent bash -c 'ssh-add /opt/app/.ssh/id_rsa; git clone git@gitlab.foo:bar/project.git'

克隆回购没有问题,并且主机已添加到known_hosts。 完成之后,我的代码将按预期工作...

known_hosts必须与之相关。有人有类似的问题吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

此变体:

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

对我来说很好!

答案 1 :(得分:0)

您应该使用clone_from的环境。

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'})

答案 2 :(得分:0)

虽然现有的答案涵盖了缺少SSH env的问题,但我遇到的情况是,远程主机密钥只能通过GitPython接受,而环境不能修改为在已知主机中包含该主机密钥。

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

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