【问题标题】:GitPython - cloning with ssh key - Host key verification failedGitPython - 使用 ssh 密钥克隆 - 主机密钥验证失败
【发布时间】:2020-10-17 00:26:17
【问题描述】:


我在我的应用程序中克隆 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: 无法从远程存储库读取。\n\n请确保您具有正确的访问权限\n并且存储库存在。\n '

git.exc.GitCommandError: Cmd('git') failed due to: exit code(128) 命令行: 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'

Repo 克隆没有问题 + 主机添加到 known_hosts。 之后,我的代码按预期工作...

它必须是known_hosts。有人遇到过类似问题吗?

感谢您的帮助。

【问题讨论】:

标签: python git gitpython


【解决方案1】:

你应该使用 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'})

【讨论】:

  • 这个答案应该得到更多的支持。我被另一个答案 here 误导了,它不适用于 clone_from 案例。
【解决方案2】:

这个变种:

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

对我来说很好用!

【讨论】:

    【解决方案3】:

    虽然现有答案涵盖了缺少 SSH 环境是问题的情况,但我有一个场景,远程主机密钥仅可以通过 GitPython 接受,并且环境无法修改为在已知主机中包含该主机密钥。

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-20
      • 2020-07-15
      • 2011-05-08
      • 1970-01-01
      • 2019-10-21
      • 2019-12-08
      • 2017-09-10
      • 2021-12-25
      • 2013-02-16
      相关资源
      最近更新 更多