也许是一个相当不寻常的情况,但我想指定一个私有SSH密钥,以便在从本地计算机执行shell(git)命令时使用 .
基本上是这样的:
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连接到远程服务器的示例,它使用指定的私钥,但这是一个本地命令 . 可能吗?
20 回答
总结答案和comments,设置git以使用不同密钥文件然后忘记它的最佳方法,它也支持同一主机的不同用户(例如个人GitHub帐户和工作帐户),适用于Windows同样,是编辑
~/.ssh/config
(或c:\Users\<your user>\.ssh\config
)并指定多个身份:然后,要将项目克隆为个人用户,只需运行常规
git clone
命令即可 .要将repo克隆为
workuser
,请运行git clone git@github-work:company/project.git
.您需要创建一个〜/ .ssh / config,如下所示
许可如下
将您的公钥添加到您的git(cat~ / .ssh / id_rsa_pub [或simillar name])
然后git克隆如下
我使用
zsh
并在我的笔记本电脑上自动将不同的密钥加载到我的zsh shell的ssh-agent
以用于其他目的(即访问远程服务器) . 我修改了@Nick 's answer and I' m,用于我需要经常刷新的一个repos . (在这种情况下,这是我的dotfiles
,无论我在哪里工作,我都想在所有机器上使用相同的最新版本 . )生成一个ssh-agent
向代理添加只读密钥
将目录更改为我的git仓库
如果
cd
到repo dir成功,请从远程仓库中取出杀死ssh-agent . (我不希望许多代理人徘徊 . )
为 gitlab
RSAAuthentication yes
doc is here
在使用Git Bash的Windows中,您可以使用以下内容添加存储库
ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"'
,例如:ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'
驱动器D中的哪个私钥,计算机的文件夹测试 . 此外,如果要克隆存储库,可以使用git clone
更改git remote add origin
.输入Git Bash之后,它会询问你的密码!
请注意openssh私钥和腻子私钥是不同的!
如果您使用puttygen创建了密钥,则必须将私钥转换为openssh!
我使用了GIT_SSH环境变量 . 这是我的包装器,类似于上面的Joe Block,但处理任意数量的参数 .
文件〜/ gitwrap.sh
然后,在我的.bashrc中,添加以下内容:
如上所述:https://superuser.com/a/912281/607049
您可以按per-repo配置它:
您可以使用GIT_SSH环境变量 . 但是您需要将ssh和options包装到shell脚本中 .
请参阅命令shell中的git manual:
man git
.从Git 2.3.0开始,我们也有简单的命令(不需要配置文件):
您可能需要重新启动计算机上的ssh服务 .
my_git_ssh_wrapper的内容:
然后你可以通过这样做来使用密钥:
如果SSH端口号不是22(默认),请在
~/.ssh/config
中添加Port xx
在我的情况下(synology),
然后使用config中的主机 Headers 进行克隆 . (“my_synology” . 避免@chopstik的“*”)
这些解决方案都不适合我 .
相反,我详细阐述了@Martinv.Löwis提到为SSH设置
config
文件 .SSH将查找用户的
~/.ssh/config
文件 . 我的设置如下:我添加了一个远程git存储库:
然后git命令对我来说正常工作 .
NOTES
IdentitiesOnly yes
需要prevent the SSH default behavior发送与每个协议的默认文件名匹配的标识文件 . 如果您有一个名为~/.ssh/id_rsa
的文件,将在没有此选项的~/.ssh/id_rsa.github
之前尝试 .References
Best way to use multiple SSH private keys on one client
How could I stop ssh offering a wrong key
使用git 2.10(2016年第3季度:2016年9月2日发布),您可以为
GIT_SSH_COMMAND
设置配置(而不仅仅是Rober Jack Will的answer中描述的环境变量)见commit 3c8ede3(2016年6月26日)Nguyễn Thái Ngọc Duy (pclouds) .
(由Junio C Hamano合并 - gitster - 在提交dc21164,2016年7月19日)
这意味着
git clone
可以是:当您需要使用正常请求(
git pull origin master
)连接到github时,在~/.ssh/config
中将主机设置为*
对我来说,任何其他主机(例如,"github"或"gb")都无法正常工作 .其中许多解决方案看起来很诱人 . 但是,我找到了通用的git-wrapping-script在以下链接中的方法是最有用的:
How to Specify an ssh Key File with the git command
关键是没有
git
命令,如下所示:Alvin的解决方案是使用一个明确定义的bash-wrapper脚本来填补这个空白:
git.sh
的位置是:我可以验证这解决了我使用
git remote update
,git pull
和git clone
进行远程bitbucket repo的用户/密钥识别问题 . 所有这些现在在一个cron
作业脚本中工作正常,否则导航有限shell时遇到问题 . 我也能从R中调用这个脚本,仍然可以解决完全相同的cron
执行问题(例如system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
) .不是R和Ruby一样,但如果R可以做到...... O :-)
如果这里没有其他解决方案适合你,并且你已经创建了多个ssh-key,但仍然不能做简单的事情
然后假设您有两个ssh密钥文件,如
然后在你正在努力的git repo里面(cd进入那里),尝试:
并确保您的github默认用户名和用户ID是正确的:
有关更多信息,请参见https://gist.github.com/jexchan/2351996 .
其他人关于
~/.ssh/config
的建议比较复杂 . 它可以很简单:更好的想法是将主机或ip添加到
.ssh/config
文件中,如下所示:我的诀窍是使用git @ hostname而不是http://hostname
这样的东西应该工作(由orip建议):
如果您更喜欢子壳,您可以尝试以下(虽然它更脆弱):
Git将调用SSH,它将通过环境变量找到它的代理;反过来,这将加载密钥 .
或者,如果您愿意将仅包含
.ssh
目录的目录设置为HOME
,则设置HOME
也可以执行此操作;这可能包含identity.pub或config file设置IdentityFile .