zoukankan      html  css  js  c++  java
  • 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/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/

    参考文献

  • 相关阅读:
    C# 关于调用微信接口的代码
    Winform实现微信功能
    Delphi 7 在IDE菜单中增加UPX工具
    Delphi7中Unicode,ANSI,UTF编码问题
    本机时间不正确带来的问题
    Delphi最简化异步选择TCP服务器
    C# Winform小程序:局域网设置NTP服务器、实现时间同步
    开源Inno Setup官网下载、安装、打包教程(官网安装向导中文语言包)
    css 雪碧图的制作
    原生js 实现的瀑布流
  • 原文地址:https://www.cnblogs.com/chenkeyu/p/10440798.html
Copyright © 2011-2022 走看看