ssh可以-i选择在身份验证时告诉使用哪个私钥文件:
-i identity_file选择一个文件,从中读取用于RSA或DSA身份验证的身份(私钥)。缺省值是
~/.ssh/identity用于协议版本1,和~/.ssh/id_rsa和~/.ssh/id_dsa对于协议版本2.身份文件也可以在每个主机的基础在配置文件中指定。可能有多个-i选项(以及在配置文件中指定的多个标识)。
有没有类似的方法来判断git在~/.ssh目录中具有多个私钥的系统上使用哪个私钥文件?
ssh可以-i选择在身份验证时告诉使用哪个私钥文件:
-i identity_file选择一个文件,从中读取用于RSA或DSA身份验证的身份(私钥)。缺省值是
~/.ssh/identity用于协议版本1,和~/.ssh/id_rsa和~/.ssh/id_dsa对于协议版本2.身份文件也可以在每个主机的基础在配置文件中指定。可能有多个-i选项(以及在配置文件中指定的多个标识)。
有没有类似的方法来判断git在~/.ssh目录中具有多个私钥的系统上使用哪个私钥文件?
Answers:
在中~/.ssh/config,添加:
host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
User git
现在您可以做git clone git@github.com:username/repo.git。
注意:验证IdentityFile上的权限为400。SSH将以一种不太明确的方式拒绝太易读的SSH密钥。看起来就像是凭证拒绝。在这种情况下,解决方案是:
chmod 400 ~/.ssh/id_rsa_github
HostName:指定要登录的真实主机名。可用于为主机指定昵称或缩写。” 我的ssh版本是openssh-6.7p1。
chmod 600 ~/.ssh/config
core.sshCommandgit配置的。superuser.com/a/912281/162466
GIT_SSH_COMMAND:从Git 2.3.0版开始,您可以使用如下环境变量GIT_SSH_COMMAND:
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example
请注意,-i有时配置文件可能会覆盖它,在这种情况下,应给SSH一个空的配置文件,如下所示:
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example
core.sshCommand:从Git 2.10.0版本开始,您可以按每个仓库或全局配置它,因此您无需再设置环境变量!
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example",而后git clone example
example=hello /usr/bin/env | grep example。
/dev/null在类似UNIX的操作系统中只是一个有效的文件名,在Windows上不起作用。
GIT_SSH_COMMAND没有工作,直到我用了IdentitiesOnly,像这样的命令:GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push。
有没有直接的方式告诉git要使用的私钥,因为它依赖于ssh对存储库的认证。但是,仍有几种方法可以实现您的目标:
ssh-agent您可以ssh-agent用来临时授权您的私钥。
例如:
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
GIT_SSH_COMMAND使用GIT_SSH_COMMAND环境变量(Git 2.3.0+)传递ssh参数。
例如:
$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
git clone user@host
您可以在一行中输入所有内容-忽略$并忽略\。
GIT_SSH使用GIT_SSH环境变量传递ssh参数以指定备用ssh二进制文件。
例如:
$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host
注意:以上几行是shell(终端)命令行,您应该将其粘贴到终端中。他们将创建一个名为的文件ssh,使其可执行并(间接)执行该文件。
注意:GIT_SSH自v0.99.4(2005)起可用。
~/.ssh/config~/.ssh/config按照其他答案中的建议使用文件,以指定私钥的位置,例如
Host github.com
User git
Hostname github.com
IdentityFile ~/.ssh/id_rsa
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'什么都没有为我工作。荣誉
~/.ssh/config方法,env vars对我不起作用...
GIT_SSH从v0.99.4(2005年8月)开始可用,因此基本上是因为Git存在(2005年4月)。
编写一个ssh使用所需参数调用的脚本,然后将脚本的文件名放入中$GIT_SSH。或者只是将您的配置放在中~/.ssh/config。
~/.ssh/config是要走的路。
$GIT_SSH和脚本解决了此问题。谢谢!
如果您不想每次运行git时都必须指定环境变量,不想使用另一个包装脚本,不要/不能运行ssh-agent(1)或不想为此下载另一个软件包,请使用git -remote-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资源使用存储库特定的部署密钥从私有Github存储库克隆/获取所需的。与基于环境/基于脚本的方法相比,此方法的另一个优点是,由于密钥路径是在工作存储库的配置中编码的,因此它将在初始克隆和后续提取/推送中使用相同的密钥。
.ssh/config。+1!
ext传输来设置远程,以便父级中的递归起作用。
fatal: transport 'ext' not allowed,则必须通过将该白名单列入ext协议export GIT_ALLOW_PROTOCOL=ext。基本上,git-remote-ext远程帮助器(支持“ ext :: ssh example.com%S foo / repo” URL)允许任意命令执行。通常,这从来都不是问题,因为用户总是看到并信任他们传递给git的URL。但是,git子模块通过.gitmodules文件允许攻击者请求客户端获取任意git URL。hackerone.com/reports/104465
在中使用自定义主机配置~/.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
Host work.github.com HostName github.com IdentityFile ~/.ssh/work,然后在每次克隆工作存储库时都将“ github.com”替换为“ work.github.com”。它仍然连接到“ github.com”,但是使用非默认密钥对。
~/.ssh/config文件中的内容。其他所有答案都错过了添加原始地址时如何设置主机的信息,原始地址会自动允许git使用正确的密钥文件。谢谢!!
经过与我的奋斗,$GIT_SSH我想分享对我有用的东西。
通过我的示例,我将假定您的私钥位于/home/user/.ssh/jenkins
$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"
否则类似的操作都会失败,因为git将尝试将值作为file执行。因此,您必须创建一个脚本。
/home/user/gssh.sh该脚本将按以下方式调用:
$ $GIT_SSH [username@]host [-p <port>] <command>
示例脚本的工作可能如下所示:
#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*
请注意$*最后,它是其中重要的一部分。
甚至更安全的替代方法是:
#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*
假设脚本位于中/home/user/gssh.sh,则您应该:
$ export GIT_SSH=/home/user/gssh.sh
一切都会工作。
您可以只使用ssh-ident而不是创建自己的包装器。
您可以在以下网址阅读更多信息:https : //github.com/ccontavalli/ssh-ident
它会在首次需要时按需加载ssh密钥,甚至在有多个登录会话,xterm或NFS共享目录的情况下,也会按需加载一次。
使用一个很小的配置文件,它可以自动加载不同的密钥,并根据需要将它们保持在不同的代理中(用于代理转发)。
所以我将GIT_SSH env变量设置为$HOME/bin/git-ssh。
为了支持让我的存储库配置决定要使用哪个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.identitygit config值:
$ git config --local ssh.identity ~/.ssh/any_other_id_rsa
瞧!
如果您可以为每个身份使用不同的电子邮件地址,则它变得更加简单,因为您可以仅在电子邮件地址之后命名密钥,然后让git config的user.email驱动密钥选择,~/bin/git-ssh如下所示:
#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*
我的解决方案是这样的:
创建一个脚本:
#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
case $i in
--port=*)
PORT="${i:7}";;
--key=*)KEY="${i:6}";;
esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND
然后,当您必须更改var运行时:
. ./thescript.sh [--port=] [--key=]
不要忘记多余的点!这使脚本设置了环境变量!--key和--port是可选的。
我在@shellholic和这个SO线程上构建了一些柚木。我以GitHub为例,并假设您有一个私钥~/.ssh/github(否则,请参见此SO线程),并且已将公钥添加到了GitHub个人资料中(否则请参见GitHub的help)。
如果需要,请在创建新的SSH配置文件,~/.ssh/config并将权限更改为400
touch ~/.ssh/config
chmod 600 ~/.ssh/config
将此添加到~/.ssh/config文件中:
Host github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes
如果已经设置了远程设置,则可能要删除它,否则可能会提示您输入用户名和密码:
git remote rm origin
然后将远程添加到git存储库,并在用户名之前注意冒号:
git remote add origin git@github.com:user_name/repo_name.git
然后git命令正常工作,例如:
git push origin master
git pull origin
@HeyWatchThis在此SO线程上建议添加IdentitiesOnly yes以防止SSH默认行为,即发送与每个协议的默认文件名匹配的身份文件。有关更多信息和参考,请参见该线程。
只需使用ssh-agent和ssh-add命令。
# 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
克隆您的存储库。
重新启动计算机后,需要执行以上命令。
我使用的是git版本2.16,不需要一个脚本,甚至不需要配置或修改的命令。
git自动读取密钥。我什么都没问,也没有抛出错误。一切正常。
~/.ssh目录中具有多个私钥的系统”?
虽然这个问题并没有要求,但我想把这个答案提供给其他只想解决gitlab的人。
我尝试使用环境变量方法,但即使git文档也建议将其~/.ssh/config用于除简单情况以外的其他操作。就我而言,我正在推送到gitlab服务器-我想以特定用户的身份进行操作-这当然是由身份验证期间的私钥而不是username定义的。实施后,我只需执行以下操作:git
~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]
在我的情况下,请回忆起私钥 的位置/myfolder/.ssh/my_gitlab_id_rsa。
在中添加一个条目~/.ssh/config:
Host gitlab-delegate
HostName gitlab.mydomain.com
User git
IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
IdentitiesOnly yes
添加git的别名在~/.gitconfig:
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 在与同一用户相同的主机上执行提交:
mycommit = "!f() { \
git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
}; f"
以上所有假设都假设相关的远程服务器是origin并且相关分支当前已签出。作为参考,我遇到了一些需要解决的问题:
当您有多个git帐户并且想要不同的ssh密钥时
您必须遵循相同的步骤来生成ssh密钥,但是请确保您
ssh-keygen -t ed25519 -C "your-email-id@gmail.com"
输入您要保存的路径(例如:my-pc / Desktop / .ssh / ed25519)
将公钥添加到您的gitlab中(如何将ssh密钥添加到gitlab中)
您必须使用以下命令重新设置ssh身份
ssh-add ~/my-pc/Desktop/.ssh/ed25519
# 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