GitPython - клонирование с помощью ключа ssh - проверка ключа хоста не удалась - PullRequest
0 голосов
/ 01 октября 2018


У меня проблема с клонированием репозитория 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] Ожидание автоматического прерывания stderr: b'Host проверка ключа не удалась. \ Nfatal: Не удалось прочитать из удаленного хранилища. \ N \ nПожалуйста, убедитесь, что у вас естьправильные права доступа \ nи хранилище существует. \ n '

git.exc.GitCommandError: Ошибка Cmd (' git ') из-за: кода выхода (128) cmdline: git clone --branch = master -vgit@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.У кого-нибудь была похожая проблема?

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

1 Ответ

0 голосов
/ 21 февраля 2019

Вы должны использовать 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'})
...