社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

gitpython-使用ssh密钥克隆-主机密钥验证失败

user3043817 • 4 年前 • 583 次点击  


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

git.exc.gitcommand错误:cmd(“git”)失败,原因是:退出代码(128) 命令行:git clone--branch=master-v git@gitlab.foo:bar/project.git/tmp/tmpi_w2xhgt stderr:'主机密钥验证失败。

当我尝试直接从机器连接到同一个repo时,上面代码创建的密钥文件带有:

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

复制repo时没有问题+主机添加到 known_hosts . 在这样做之后,我的代码就如预期的那样工作了…

一定是和 已知主机 . 有人有类似的问题吗?

谢谢你的帮助。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38133
 
583 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Armali
Reply   •   1 楼
Armali    5 年前

您应该使用env of 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'})