问题描述

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/identity for protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for protocol version 2.  Identity files may also be specified on a per-host basis in the configuration file.  It is possible to have multiple -i options (and multiple identities specified in configuration files).

有没有类似的方法告诉git哪个私钥文件在~/.ssh目录中有多个私钥的系统上使用?

最佳解决方案

~/.ssh/config中,添加:

  1.  
    host github.com
  2.  
    HostName github.com
  3.  
    IdentityFile ~/.ssh/id_rsa_github
  4.  
    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或全局,所以您不必再设置环境变量!

  1.  
    git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
  2.  
    git pull
  3.  
    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参数。

例如:

  1.  
    $ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
  2.  
    git clone user@host

您可以在一行中输入所有内容,省略

选项3:GIT_SSH

使用GIT_SSH环境变量传递ssh参数。

例如:

  1.  
    $ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
  2.  
    $ chmod +x ssh
  3.  
    $ 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>

工作示例脚本可能如下所示:

  1.  
    #!/bin/sh
  2.  
    ssh -i /home/user/.ssh/jenkins $*

注意$*到底是它的重要组成部分。

甚至更安全的选择,这将防止任何与您的默认配置文件中的任何可能的冲突(加上明确提及要使用的端口)将是:

  1.  
    #!/bin/sh
  2.  
    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 )外部运输:

  1.  
    $ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
  2.  
    Cloning into 'repository'
  3.  
    (...)
  4.  
    $ cd repository
  5.  
    $ git remote -v
  6.  
    origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
  7.  
    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中使用自定义主机配置,如下所示:

  1.  
    Host gitlab-as-thuc
  2.  
    HostName git.thuc.com
  3.  
    User git
  4.  
    IdentityFile ~/.ssh/id_rsa.thuc
  5.  
    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的更多相关文章

  1. git的安装以及生成ssh key

    安装git 在ubuntu系统下输入以下命令安装git软件: sudo apt-get install git 输入以下命令查看git是否安装成功: git --version 如下图所示则表示安装成 ...

  2. 管理git生成的多个ssh key

    http://www.bootcss.com/p/git-guide/ 问题阐述 当有多个git账号的时候,比如一个github,用于自己进行一些开发活动,再来一个gitlab,一般是公司内部的git ...

  3. 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 ...

  4. git生成ssh key步骤并添加到github网站

    0: 查看是否已经有了ssh密钥 执行命令:cd ~/.ssh 如果没有密钥则不会有此文件夹,有则备份删除 1:使用 Git Bash生成新的ssh key ssh-keygen -t rsa -C  ...

  5. git 创建SSH key

    可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作.好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要 ...

  6. 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 ...

  7. Mac下配置多个SSH KEY访问远程Git服务

    第一步 生成对应的ssh key 1 后面输入你的用户名 或者 邮箱 2 输入一个独立的ssh key名字 区别之前的名字 第二步  编辑 config文件 在.ssh/目录下面 在config文件配 ...

  8. Git安装及SSH Key管理之Windows篇

    一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Git版本:Git-2.11.0-64-bit.exe(64位) 二.Git安装 去官网下载完后一路下一步完成安装,如下图:   ...

  9. Git安装以及配置SSH Key——Windows

    安装 安装 Git 官网下载一个Windows版本的Git. 然后一直下一步即可,如下图 环境变量自动配好的,可以去检查一下环境变量中PATH中有没有Git的环境变量 然后在桌面右击鼠标,选择Git ...

随机推荐

  1. android侧滑删除,模仿qq跟进item显示删除按钮

    今天所写的代码只是为了个人以后查询方便,如果你参考了并且在使用中遇到问题也可以在这里直接回复我 SwipeDelMenuLayout: 效果图: item布局: <?xml version=&q ...

  2. soapUI-property Transfer

    1.1.1  Property Transfer 创建或双击现有的Property-Transfer TestStep将打开以下窗口: 左侧的列表显示了此TestStep中配置的传输,添加和管理所需的 ...

  3. [LeetCode] 197. Rising Temperature_Easy tag: SQL

    Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...

  4. selenium webdriver窗口切换(上)

    selenium webdriver窗口切换,有时候在做自动化的时候需要打开很多很多的页面, 当在操作不同的页面的时候需要切换窗口,下面是如何切换到前后页面窗口的操作: package test201 ...

  5. testng入门教程11 TestNG运行JUnit测试

    现在,您已经了解了TestNG和它的各种测试,如果现在担心如何重构现有的JUnit代码,那就没有必要,使用TestNG提供了一种方法,从JUnit和TestNG按照自己的节奏.也可以使用TestNG执 ...

  6. 兼容安卓和ios实现一键复制内容到剪切板

    实现代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...

  7. Lower Power with CPF(四)

    CPF从Front-end到Back-end(RTL--GDSII)的整个流程: 1)Creating a CPF file:来在前端就建立lower power的规范. 2)检查CPF文件的正确性, ...

  8. 一款优秀的OA办公系统有哪些功能?

    OA办公系统解决企业的日常管理规范化.增加企业的可控性.提高企业运转的效率的基本问题,范围涉及日常行政管理.各种事项的审批.办公资源的管理.多人多部门的协同办公.以及各种信息的沟通与传递.可以概括的说 ...

  9. 24最小生成树之Prim算法

    最小生成树的Prim算法 思想:采用子树延伸法 将顶点分成两类: 生长点——已经在生成树上的顶点 非生长点——未长到生成树上的顶点 使用待选边表: 每个非生长点在待选边表中有一条待选边,一端连着非生长 ...

  10. SpringMVC+Spring+Mybatis+Maven+mysql整合

    一.准备工作1.工具:jdk1.7.0_80(64)+tomcat7.0.68+myeclipse10.6+mysql-5.5.48-win322. 开发环境安装配置.Maven项目创建(参考:htt ...