如何让 SSH 仅使用 ssh-agent 提供的密钥?

如何让 SSH 仅使用 ssh-agent 提供的密钥?

ssh只需要使用 提供的密钥ssh-agent,并忽略 中的任何身份文件~/.ssh。最好的方法是什么?

背景:我需要通过 SSH 向 Git 服务器进行身份验证。我有一个~/.ssh/id_rsa可以正确进行身份验证的服务器,但其关联的 Git 用户没有正确的存储库访问权限。因此,我需要使用不同的密钥(我只能通过 提供)ssh-agent来以正确的 Git 用户身份进行身份验证。但是,由于 SSH 似乎使本地身份文件优先于代理提供的身份文件,因此我最终总是被认证为错误的用户。

答案1

没有选择确切地(除了将 id_rsa 重命名为 id_whatever)。

但真正的问题似乎是“我如何才能ssh具体的仅限代理的密钥”。实际上,这个问题更容易回答——你可以IdentityFile像往常一样使用相同的 (-i) 选项来做到这一点。

首先使用ssh-add -L提取民众密钥从代理复制到文件;然后指向IdentityFile提取的公钥。即使没有私钥部分,ssh 也会接受它,并会自动使用 ssh-agent 进行身份验证。

答案2

我想出了以下代码,用于在无人值守的脚本中测试用户是否通过 ssh-agent 拥有 ssh-key 访问权限。我正在测试是否将有效密钥加载到 ssh-agent 中,并且我不希望自动加载其他密钥。我发现唯一的方法是暂时删除读取 ~/.ssh 的权限。我也将 github 指纹放在临时的 known_hosts 文件中,但-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no也可以使用它来忽略指纹检查。

chmod 0 ~/.ssh
ssh-keyscan github.com > /tmp/github_known_hosts
GIT_SSH_COMMAND="ssh -q -o UserKnownHostsFile=/tmp/github_known_hosts" git ls-remote ssh://[email protected]/Account/REPO.git >/dev/null 2>&1
# Return status: 0 if successful, anything else if not
echo $?
chmod 700 ~/.ssh

我也尝试使用上述方法结合 GitHub 推荐的“ssh -T[电子邮件保护]“,但这里的返回状态来自 GitHub 在其终端运行的任何命令,截至今天为 1。

相关内容