这可能是一种非常不寻常的情况,但我想指定在本地计算机上执行shell(git)命令时要使用的私有SSH密钥。
基本上是这样的:
git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
或者更好(用Ruby):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone git@github.com:TheUser/TheProject.git")
end
我见过使用Net::SSH连接到远程服务器的示例,该服务器使用指定的私钥,但这是一个本地命令。有可能吗?
最快、最简单的方法是:
使用ssh克隆您的repo:
git-c core.sshCommand=“ssh-i~/.ssh/<your_key>”克隆git@github.com:<user>/<repo>.git
然后cd到克隆的repo中,然后:
git-config-core.shCommand'ssh-i~/.ssh/<your_key>'
要测试它是否工作:
git--git-dir=/path/to/repo/.git pull
所以你可能会想:为什么我在github中安装了.pub,而private在默认目录中之后,我创建的ssh密钥就不起作用了?
该文档为我们提供了一个澄清问题的命令:ssh-vTgit@github.com
输出显示了git查找的ssh密钥列表。因此,您可能希望使用这些名称之一创建密钥,或者使用上述过程来包含所需的密钥。
如果你像我一样,你可以:
整理好ssh密钥保持gitclone命令简单为任意数量的存储库处理任意数量的密钥。减少ssh密钥维护。
我将密钥保存在~/.ssh/keys目录中。
我更喜欢约定而不是配置。
我认为守则就是法律;越简单越好。
步骤1-创建别名
将此别名添加到shell:alias git clone='git_SSH=SSH_wrapper git clone'
第2步-创建脚本
将此ssh_wrapper脚本添加到PATH中:
#!/bin/bash
# Filename: ssh_wrapper
if [ -z ${SSH_KEY} ]; then
SSH_KEY='github.com/l3x' # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "$@"
示例
使用github.com/l3x密钥:
KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go
以下示例还使用github.com/l3x密钥(默认情况下):
git-clone https://github.com/l3x/learn-fp-go
使用bitbucket.org/lsheehan密钥:
KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git
笔记
将SSH_wrapper脚本中的默认SSH_KEY更改为大多数时间使用的SSH_KEY。这样,您不需要在大多数时间使用KEY变量。
你可能会想,“嘿!别名、脚本和一些密钥目录都是如此,”但对我来说,这是惯例。我几乎所有的工作站(以及服务器)都是类似的配置。
我的目标是简化我定期执行的命令。
我的约定,例如Bash脚本、别名等,创建了一个一致的环境,并帮助我保持简单。
KISS和名字很重要。
有关更多设计技巧,请参阅我的书《Go》中的第4章固体设计:https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW
希望这有帮助。-莱克斯
这些解决方案都不适合我。
相反,我详细介绍了@Martin v.Löwis提到的为SSH设置配置文件。
SSH将查找用户的~/.SSH/config文件。我的设置如下:
Host gitserv
Hostname remote.server.com
IdentityFile ~/.ssh/id_rsa.github
IdentitiesOnly yes # see NOTES below
我添加了一个远程git存储库:
git remote add origin git@gitserv:myrepo.git
然后git命令对我来说正常工作。
git push -v origin master
笔记
IdentitesOnly yes是必需的,以防止SSH默认行为发送与每个协议的默认文件名匹配的标识文件。如果您有一个名为~/.ssh/id_rsa的文件,则在不使用此选项的情况下,将在~/.sss/id_rsa.gitub之前尝试该文件。
工具书类
在一个客户端上使用多个SSH私钥的最佳方法我怎样才能阻止ssh提供错误的密钥