GitPython – клонирование с помощью ключа ssh – ошибка проверки ключа хоста


у меня возникла проблема с клонированием репозитория 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и репозиторий существует.\n'

git.exc.GitCommandError: Cmd('git') не удалось из-за: кода выхода (128) cmdline: git clone --branch=master -v [email protected]:bar/project.git /tmp/tmpi_w2xhgt stderr: ' Ошибка проверки ключа хоста.

Когда я пытаюсь подключиться к тому же репо напрямую с машины с файлом ключа, созданным кодом выше, с помощью:

ssh-agent bash -c 'ssh-add /opt/app/.ssh/id_rsa; git clone [email protected]:bar/project.git'

Репо клонируется без проблем + хост добавляется в known_hosts. После этого мой код работает как положено...

Это должно быть что-то с known_hosts. У кого-нибудь была похожая проблема?

Спасибо за вашу помощь.


person user3043817    schedule 01.10.2018    source источник
comment
Это функция безопасности. Соответствующие how-to-add-hostname-to-known-hosts -using-python и paramiko-add-host-key -к-известным-хостам-навсегда   -  person stovfl    schedule 01.10.2018


Ответы (3)


Вы должны использовать env для 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'})
person yuta    schedule 21.02.2019
comment
Этот ответ должен получить больше голосов. Меня ввел в заблуждение другой ответ здесь, который не работал для случая clone_from. - person Shadi; 09.08.2019

Этот вариант:

git.Repo.clone_from("[email protected]:user/coolrepo.git", r"..\coolrepo", env=dict(GIT_SSH_COMMAND="ssh -i id_rsa"))

отлично работает для меня!

person Viktoriya Medvinskaya    schedule 24.01.2020

В то время как существующие ответы охватывают случаи, когда проблема заключалась в отсутствии окружения SSH, у меня был сценарий, когда ключ удаленного хоста только принимался через GitPython, и среду нельзя было изменить, чтобы включить этот ключ хоста в известных хостах.

Чтобы гарантировать, что несоответствие ключей хоста никогда не нарушит ваш код, отключите строгие проверки ключей хоста с помощью команды ssh:

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