如何告诉git要使用哪个私钥?
ssh有-i选项,可以告诉身份验证时使用哪个私钥文件:
-i identity_file选择从哪个文件中读取RSA或DSA身份认证的身份(私钥)。 默认是 1的协议版本 1, 2的协议版本 2的协议版本 也可以在配置文件中按每个主机指定身份文件。 可以有多个
~/.ssh/identity选项(也可以在配置文件中指定多个身份)。
有没有类似的方法告诉~/.ssh/id_rsa在~/.ssh/id_dsa目录下有多个私钥的系统中使用哪个私钥文件?
ssh有-i选项,可以告诉身份验证时使用哪个私钥文件:
-i identity_file选择从哪个文件中读取RSA或DSA身份认证的身份(私钥)。 默认是 1的协议版本 1, 2的协议版本 2的协议版本 也可以在配置文件中按每个主机指定身份文件。 可以有多个
~/.ssh/identity选项(也可以在配置文件中指定多个身份)。
有没有类似的方法告诉~/.ssh/id_rsa在~/.ssh/id_dsa目录下有多个私钥的系统中使用哪个私钥文件?
在~/.ssh/config中,添加:
host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
User git
如果配置文件是新的,不要忘记做chmod 600 ~/.ssh/config
现在你可以做git clone git@github.com:{ORG_NAME}/{REPO_NAME}.git
{ORG_NAME}是你的GitHub用户账户(或组织账户)的GitHub URI名。:后面有一个冒号github.com,而不是斜线/ - 因为这不是一个URI。SSH会以一种不明确的方式拒绝太可读的SSH密钥。只会出现类似于信令拒绝的情况。这种情况下,解决方法是:chmod 400 ~/.ssh/id_rsa_github
没有直接的方法告诉git要使用哪一个私钥,因为它依赖于ssh进行仓库认证。但是,仍然有几种方法可以实现你的目标:
ssh-agentssh-agent你可以使用 GIT_SSH_COMMAND 来临时授权你的私钥。
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
GIT_SSH_COMMAND$通过使用环境变量没有**直接的方法**告诉git要使用哪一个私钥,因为它依赖于ssh`进行仓库认证。但是,仍然有几种方法可以实现你的目标:
ssh-agentssh-agent你可以使用 GIT_SSH_COMMAND 来临时授权你的私钥。
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
GIT_SSH_COMMAND$通过使用环境变量环境变量来指定备用的GIT_SSH二进制文件来传递ssh参数。
注:GIT_SSH是从v0.99.4版本开始的 (2005年)。
写一个脚本,用你想要的参数调用ssh,然后把脚本的文件名放在$GIT_SSH中。或者直接把你的配置放在~/.ssh/config中。
在~/.ssh/config中使用自定义主机配置,如:
Host gitlab-as-thuc
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa.thuc
IdentitiesOnly yes
,然后使用你的自定义主机名,如:
git remote add thuc git@gitlab-as-thuc:your-repo.git
如果你不希望每次运行git时都要指定环境变量,不需要另一个包装程序脚本,不需要/不能运行ssh-agent(1),也不想为此下载另一个包,那就使用git-remot-ext(1)外部传输。
$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)
我认为这个方案更优越,因为:
经过我在$GIT_SSH上的挣扎,我想分享一下我的成功经验。
通过我的例子,我将假设你的私钥位于/home/user/.ssh/jenkins
$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"
或其他类似的选项会失败,因为git会尝试将该值作为文件执行。因此,你必须创建一个脚本。
你可以直接使用 ssh-ident 而不是创建自己的包装器。
你可以在以下网站阅读更多内容。https://github.com/ccontavalli/ssh-ident
它可以在第一次需要的时候按需加载ssh密钥,一次加载,即使是多个登录会话、exterms或NFS共享家园。
通过一个小小的配置文件,它可以根据你的需要自动加载不同的密钥,并将它们分开放在不同的代理中(用于代理转发)。
我有一个客户需要一个单独的github账户,所以我需要为这个项目使用单独的密钥。我的解决方案是在我的.cshrc/.bashrc中添加这样的内容:
alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"
每当我想用git来做这个项目的时候,我就把 “infogit "替换成git:
infogit commit -am "Some message" && infogit push
对我来说,这样更容易记住。
所以我将GIT/SSH env变量设置为$HOME/bin/git-ssh。
为了支持我的repo配置决定使用哪个ssh身份,我的~/bin/git-ssh文件是这样的:
#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*
然后我有一个全局的git config设置:
$ git config --global ssh.identity ~/.ssh/default_id_rsa
在任何一个git仓库里,我可以设置一个本地的ssh.identity git config值:
$ git config --local ssh.identity ~/.ssh/any_other_id_rsa
Voila!
如果你可以为每一个身份设置不同的电子邮件地址,那就更简单了,因为你可以用你的电子邮件地址来命名你的密钥,然后让git config的user.email来驱动~/bin/git-ssh中的密钥选择,就像这样:
#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*
我是在@shellholic和this SO线程的基础上加了一些teaks。我以GitHub为例,假设你在~/.ssh/github里有一个私钥(否则请看this SO线程),并且你在GitHub的配置文件中添加了公钥(否则请看GitHub的帮助)。
如果需要的话,在~/.ssh/config处创建一个新的SSH配置文件,并将权限改为400
touch ~/.ssh/config
chmod 600 ~/.ssh/config
添加到~/.ssh/config文件中:
Host github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes
如果你已经有了远程设置,你可能需要删除它,否则可能仍然会被提示用户名和密码。
git remote rm origin
git remote add origin git@github.com:user_name/repo_name.git
然后在git仓库中添加一个远程,注意用户名前的冒号:
git push origin master
git pull origin
然后git命令正常工作,例如 例如:
&001
@HeyWatchThis在这个SO线程上建议加入IdentitiesOnly yes,以防止SSH默认的行为,即发送与每个协议的默认文件名匹配的身份文件。更多信息和参考资料请参见该线程。
# create an agent
ssh-agent
# add your default key
ssh-add ~/.ssh/id_rsa
# add your second key
ssh-add ~/.ssh/<your key name>
执行上述命令后,可以同时使用这两个键。只要输入
git clone git@github.com:<yourname>/<your-repo>.git
就可以克隆你的仓库。
# start :: how-to use different ssh identity files
# create the company identity file
ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
# save private key to ~/.ssh/id_rsa.corp,
cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys
# create your private identify file
ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
# save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys
# clone company internal repo as follows
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git clone git@git.in.corp.com:corp/project.git
export git_msg="my commit msg with my corporate identity, explicitly provide author"
git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git push
# and verify
clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s
# clone public repo as follows
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git clone git@github.com:acoolprojectowner/coolproject.git
export git_msg="my commit msg with my personal identity, again author "
git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
git push ;
# and verify
clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s
# stop :: how-to use different ssh identity files
虽然这个问题并没有要求,但我在这里为其他想解决同样问题的人提供了这个答案。在我的情况下,我是以一个gitlab服务器的身份推送到gitlab服务器–我想以一个特定的用户的身份推送–当然,这个用户是由身份验证期间的private-key定义的,而不是用户名~/.ssh/config。一旦实现,我只需执行以下操作:
~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]
在我的情况下,调用你的私钥 git的位置。
在 /myfolder/.ssh/my_gitlab_id_rsa:
Host gitlab-delegate
HostName gitlab.mydomain.com
User git
IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
IdentitiesOnly yes
中添加一个条目,在 ~/.ssh/config:
mypush = "!f() { \
path=$(git config --get remote.origin.url | cut -d':' -f2); \
branch=$(git rev-parse --abbrev-ref HEAD); \
git remote add gitlab_as_me git@gitlab-delegate:$path && \
git push gitlab_as_me $branch && \
git pull origin $branch; \
git remote remove gitlab_as_me; \
}; f"
中添加 git-alias 作为奖励,我 在这个主机上以特定用户的身份执行我的提交 与这个 git-alias 。
mycommit = "!f() { \
git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
}; f"
以上所有的操作都是假设相关的远程是~/.gitconfig,并且相关的分支目前已经被检查出来了。作为参考,我遇到了几项需要解决的问题。
当你有多个git账号,并且你想要不同的ssh密钥时
你必须按照同样的步骤生成ssh密钥,但要确保你
ssh-keygen -t ed25519 -C "your-email-id@gmail.com"
输入你要保存的路径(例如:my-pc/Desktop/. ssh/ed25519)
将公钥添加到你的 gitlab 如何将 ssh 密钥添加到 gitlab)
你必须使用下面的命令
ssh-add ~/my-pc/Desktop/.ssh/ed25519
``` 来新建 ssh 身份。
我使用的是git 2.16版本,我不需要任何脚本,甚至不需要任何配置和修改命令。我没有问任何问题,也没有抛出一个错误。就能正常工作。