git 指定要提交的ssh key
问题描述
ssh具有-i选项,用于告知在验证时使用哪个私钥文件:
-i identity_file
- Selects a file from which the identity (private key) for RSA or DSA authentication is read. The default is
~/.ssh/identityfor protocol version 1, and~/.ssh/id_rsaand~/.ssh/id_dsafor protocol version 2. Identity files may also be specified on a per-host basis in the configuration file. It is possible to have multiple-ioptions (and multiple identities specified in configuration files).
有没有类似的方法告诉git哪个私钥文件在~/.ssh目录中有多个私钥的系统上使用?
最佳解决方案
在~/.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
次佳解决方案
环境变量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,您可以配置每个repo或全局,所以您不必再设置环境变量!
- git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
- git pull
- git push
第三种解决方案
没有直接的方法告诉git哪个私钥要使用,因为它依赖于ssh进行存储库认证。但是,仍有几种方法可以实现您的目标:
选项1:ssh-agent
您可以使用ssh-agent临时授权您的私钥。
例如:
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
选项2: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
您可以在一行中输入所有内容,省略。
选项3:GIT_SSH
使用GIT_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的文件,使其可执行,并(间接)执行它。
选项4:~/.ssh/config
使用其他答案中建议的~/.ssh/config文件,以指定您的私钥的位置。
第四种方案
编写一个使用所需参数调用ssh的脚本,并将脚本的文件名放在$GIT_SSH中。或者将您的配置放在~/.ssh/config中。
第五种方案
在与$GIT_SSH斗争之后,我想分享一下对我有用的东西。
通过我的例子,我会假设你的私钥位于/home/user/.ssh/jenkins
错误避免:GIT_SSH值包括选项
$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"
或者任何类似的将失败,因为git将尝试将该值作为文件执行。因此,您必须创建一个脚本。
$ GIT_SSH脚本/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
所有人都应该工作。
第六种方案
如果您不想在每次运行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)
我认为这个解决方案是优越的,因为:
它是存储库/远程特定的
避免包装脚本膨胀
不需要SSH代理 – 如果您想要无人值守的克隆/推/拉(例如在cron)
当然,没有外部工具需要
第七种方案
您可以使用ssh-ident而不是创建自己的包装器。
您可以阅读更多:https://github.com/ccontavalli/ssh-ident
它首次需要加载ssh密钥,一次,即使是多个登录会话,xterms或NFS共享的家庭。
使用一个微小的配置文件,它可以自动加载不同的密钥,并根据您需要做的事情将它们分隔在不同的代理(代理转发)中。
第八种方案
在~/.ssh/config中使用自定义主机配置,如下所示:
- Host gitlab-as-thuc
- HostName git.thuc.com
- User git
- IdentityFile ~/.ssh/id_rsa.thuc
- IdentitiesOnly yes
然后使用您的自定义主机名:
git remote add thuc git@gitlab-as-thuc:your-repo.git
欲了解更多详情,请阅读:http://itblog.study.land/how-to-specify-different-ssh-keys-for-git-push-for-a-given-domain/
参考文献
git 指定要提交的ssh key的更多相关文章
- git的安装以及生成ssh key
安装git 在ubuntu系统下输入以下命令安装git软件: sudo apt-get install git 输入以下命令查看git是否安装成功: git --version 如下图所示则表示安装成 ...
- 管理git生成的多个ssh key
http://www.bootcss.com/p/git-guide/ 问题阐述 当有多个git账号的时候,比如一个github,用于自己进行一些开发活动,再来一个gitlab,一般是公司内部的git ...
- Git Bash for Windows add ssh key时报Could not open a connection to your authentication agent.
$ ssh-add id_rsa_bitbucketCould not open a connection to your authentication agent. 运行: $ ssh-agent ...
- git生成ssh key步骤并添加到github网站
0: 查看是否已经有了ssh密钥 执行命令:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除 1:使用 Git Bash生成新的ssh key ssh-keygen -t rsa -C ...
- git 创建SSH key
可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作.好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要 ...
- git生成公钥public key并添加SSH key。git乌龟gerrit下推送git【server sent :publickey】
一.key 码云链接:http://git.mydoc.io/?t=180845#text_180845 博客链接: 方式一:https://blog.csdn.net/xb12369/article ...
- Mac下配置多个SSH KEY访问远程Git服务
第一步 生成对应的ssh key 1 后面输入你的用户名 或者 邮箱 2 输入一个独立的ssh key名字 区别之前的名字 第二步 编辑 config文件 在.ssh/目录下面 在config文件配 ...
- Git安装及SSH Key管理之Windows篇
一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Git版本:Git-2.11.0-64-bit.exe(64位) 二.Git安装 去官网下载完后一路下一步完成安装,如下图: ...
- Git安装以及配置SSH Key——Windows
安装 安装 Git 官网下载一个Windows版本的Git. 然后一直下一步即可,如下图 环境变量自动配好的,可以去检查一下环境变量中PATH中有没有Git的环境变量 然后在桌面右击鼠标,选择Git ...
随机推荐
- es fielddata理解
在es中,text类型的字段使用一种叫做fielddata的查询时内存数据结构.当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建.它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在j ...
- Memcached与redis的比较--stackoverflow(转)
原文:http://blog.nosqlfan.com/html/3729.html 这两年Redis火得可以,Redis也常常被当作Memcached的挑战者被提到桌面上来.关于Redis与Memc ...
- 问题:bower git is not installed or not in the path
用bower install jquery安装jquery,bower提示错误bower git is not installed or not in the path. 根据错误信息的知道出现错误两 ...
- 006-springboot2.0.4 配置log4j2,以及打印mybatis的sql
一.pom配置 普通项目 <!-- log4j2 --> <dependency> <groupId>org.apache.logging.log4j</gr ...
- oj1500(Message Flood)字典树
大意:输入几个字符串,然后再输入几个字符串,看第一次输入的字符串有多少没有在后面的字符串中出现(后输入的字符串不一定出现在之前的字符串中) #include <stdio.h> #incl ...
- 如何快速获取ListView的打气筒对象
简单的方式有三种: @Override public View getView(int position, View convertView, ViewGroup parent) { View vie ...
- 你应该知道的最好Webmail邮件客户端,
1 . Kite Kite is an opensource replacement to Gmail. Kite is a webmail designed to look a lot like g ...
- Javascript-逻辑运算符非(!)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Object-C-NSArray
NSArray *fruitArray=[[NSArray alloc] initWithObjects:@"apple",@"banana",@"p ...
- php ci 报错 Object not found! The requested URL was not found on this server. If you entered the URL manually please check
Object not found! The requested URL was not found on this server. The link on the referring page see ...