簡體   English   中英

GitPython - 使用 ssh 密鑰克隆 - 主機密鑰驗證失敗

[英]GitPython - cloning with ssh key - Host key verification failed


我在我的應用程序中克隆 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 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'

回購克隆沒有問題+主機被添加到known_hosts 這樣做之后,我的代碼按預期工作......

它必須是known_hosts東西。 有人遇到過類似的問題嗎?

謝謝你的幫助。

您應該使用 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'})

這個變種:

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

對我來說很好用!

雖然現有答案涵蓋了缺少 SSH 環境的情況,但我有一個場景,即只能通過 GitPython 接受遠程主機密鑰,並且無法修改環境以在已知主機中包含該主機密鑰。

為確保主機密鑰不匹配永遠不會破壞您的代碼,請通過操作ssh命令禁用嚴格的主機密鑰檢查:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM