如何指定将使用哪个 ssh 密钥 `go get`

我在同一台笔记本电脑(运行 Ubuntu 版本 20)上使用两个不同的 github 帐户(个人和工作)。我需要能够使用我的工作 github 帐户的 ssh 密钥从工作中访问私人存储库。


我已经使用一些简洁的 git config 控件完成了所有工作,即在我的~/.gitconfig文件中我放了:


[url "git@github.com:work_account/"]

    insteadOf = https://github.com/work_account/

[includeIf "gitdir:~/src/github.com/personal_account/"]

    path=~/.gitconfig_personal

[includeIf "gitdir:~/src/github.com/work_account/"]

    path=~/.gitconfig_work

个人配置包含:


[user]

name = Your Name

email = your.name@gmail.com

[core]

sshCommand = ssh -i ~/.ssh/id_rsa

工作配置包含:


[user]

name = Your Name

email = your.name@work.com

signingkey = <ID of GPG key>

[core]

sshCommand = ssh -i ~/.ssh/id_ecdsa

[commit]

gpgsign = true

[gpg]

program = gpg

这一切都适用于从 github 拉取和推送(并使用 gpg 密钥签署工作提交),但它go get在私人仓库中失败。出于某种奇怪的原因go get,试图使用我的个人 ssh 密钥 ( ~/.ssh/id_rsa) 而不是我的工作 ssh 密钥 ( ~/.ssh/id_ecdsa)。我已经设置了GOPRIVATE环境变量,即


export GOPRIVATE=github.com/work_account/*

go get 的输出如下:


$ go get github.com/work_account/private_repo

go get github.com/work_account/private_repo: module github.com/work_account/private_repo: git ls-remote -q origin in /home/marc/pkg/mod/cache/vcs/ff3efb332cb48232e5da90ff2073685cbdac4a86e3a47aa11663696f4943637a: exit status 128:

        ERROR: Repository not found.

        fatal: Could not read from remote repository.


        Please make sure you have the correct access rights

        and the repository exists.

我可以看到我的 ssh 代理有两个键:


$ ssh-add -l

521 SHA256:EKvhgg24_blah_bApjLSqX4J7l0 your.name@work.com (ECDSA)

4096 SHA256:r/qcO94F+ox_blah_JkTiVk+aERk your.name@gmail.com (RSA)

当我删除我的个人 ssh 密钥(即rm ~/.ssh/id_rsa*)然后go get在私人仓库上工作得很好,所以我知道它肯定只是试图使用错误的 ssh 密钥。由于某种原因,它忽略了 git config core.sshCommand。


慕标5832272
浏览 236回答 3
3回答

慕工程0101907

经过大量的反复试验和挖掘,我找到了解决方案。GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ecdsa"如果我在私有仓库中设置环境变量,然后go get使用正确的 ssh 密钥,然后适用于私有仓库。似乎go get忽略了 git configcore.sshCommand但考虑到了 environment variable&nbsp;GIT_SSH_COMMAND。为了简化我的生活,我使用该程序direnv在我保存工作存储库的文件夹中设置了这个环境变量。.envrc顶级文件夹中的文件如下所示:export&nbsp;GIT_SSH_COMMAND="ssh&nbsp;-i&nbsp;~/.ssh/id_ecdsa"

jeck猫

你需要在你的~/.ssh/config文件中。如果它不存在,只需创建它。它指定用于每个主机的 ssh 密钥。您可以通过添加无效域来添加别名:Host gitlab.comIdentityFile ~/.ssh/id_ed25519Host github.comIdentityFile ~/.ssh/id_ed25519Host github.invalidHostName github.comIdentityFile ~/.ssh/id_rsa然后每次使用 git@github.invalid 时,都会使用正确的 ssh 密钥。与此相关的是对 的补充~/.gitconfig,它有助于导入私有存储库。它使用 ssh 对这些主机进行了所有 git 操作:[url "git@github.com:"]&nbsp; &nbsp; &nbsp; &nbsp; insteadOf = https://github.com/[url "git@gitlab.com:"]&nbsp; &nbsp; &nbsp; &nbsp; insteadOf = https://gitlab.com/GOPRIVATE另请参阅列出不使用代理的私有存储库的环境变量。示例:GOPRIVATE=*.corp.example.com,rsc.io/private

吃鸡游戏

您可以使用 SSH 代理。ssh-agent是openssh的一部分。它还在内存中保存未加密的密钥和证书。它们已准备好供 ssh 使用。例如,当您拥有带有passphase.&nbsp;默认情况下,它每次都会要求您输入密钥密码阶段,Go 正在尝试从上游克隆/拉取代码。有几个命令,你可以使用:echo $SSH_AGENT_PID- 查看代理是否分配给当前会话。该SSH_AGENT_PID变量应返回 pid 的ssh-agent.eval $(ssh-agent)- 开始一个新的ssh-agent会话。ssh-add -l- 列出 ssh 会话中可用的密钥ssh-add ~/.ssh/tmp/id_rsa- 将~/.ssh/tmp/id_rsa密钥添加到当前会话。示例会话可以是:ip-192-168-200-63:tf-r0 daniel$ echo $SSH_AGENT_SOCKip-192-168-200-63:tf-r0 daniel ^Cip-192-168-200-63:src daniel$ eval `ssh-agent`Agent pid 50734ip-192-168-200-63:src daniel$ echo $SSH_AGENT_PID&nbsp;50734ip-192-168-200-63:src daniel$ ssh-add -lThe agent has no identities.ip-192-168-200-63:src daniel$ ssh-add ~/.ssh/tmp/id_rsaEnter passphrase for /Users/daniel/.ssh/tmp/id_rsa:&nbsp;Identity added: /Users/daniel/.ssh/tmp/id_rsa (/Users/daniel/.ssh/tmp/id_rsa)ip-192-168-200-63:src daniel$ ssh-add -l2048 SHA256:nm/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /Users/daniel/.ssh/tmp/id_rsa (RSA)ip-192-168-200-63:src daniel$&nbsp;之后,我可以使用受密码保护的 ssh 密钥提取远程代码,而无需每次都输入,需要密钥。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go