主要是 windows 用户会遇到很多纠结的问题,linux/unix 用户属于这方面的高端用户,应该有能力处理此类问题,而且网络上也有很多解决方案,本文的受众是 windows 用户。由于今天配置了一下午,虽说配置过程基本搞清楚,懒得重新配置一遍,所以文中皆以文字形式叙述,没有截图。

一、概念的解释

1. rsa 与 rsa.pub

网上很容易搜到的东西我就不说了,我们知道,通过:

ssh-keygen -t rsa -C "something"

可以生成两个文件,这两个文件的命名默认是 id_rsa 和 id_rsa.pub,如果你在键入上述命令回车之后,重新输入了命名,那此时生成的两个文件就是 [命名][命名].pub,这个好理解。

主 要是解释下生成了两个什么东西。id_rsa 可以称之为私有密钥,id_rsa.pub 可以称之为公有密钥。我们会把公有密钥交给服务端,当需要从服务端请求内容的时候,要带上私有密钥。此时,服务器会通过一定的算法计算私有密钥,并判断计 算的结果是否与公有密钥一样,如果不一样则响应请求失败。

+-----------+                           +-----------+
|           |                           |           |
|           |    enc(rsa) == rsa.pub    |           |
|  client   | ------------------------> |   server  |
|           |             ?             |           |
|           |                           |           |
+-----------+                           +-----------+

rsa.pub 里面是个什么东西,其实很简单:

ssh-rsa base64(加密内容) "something"

而 rsa 中是:

-----BEGIN RSA PRIVATE KEY-----
base64(私有密钥的一些处理)
-----END RSA PRIVATE KEY-----

2. 验证程序

在使用 git 命令与服务端进行交互之前,我们可以先验证下服务器和客户端是否握手成功了。

ssh -T git@xxx.com

如果是 github,就可以直接写 git@github.com, 如果是 aaa.bbb.com,就可以写 git@aaa.bbb.com。 如果成功,你会看到 success 之类的字眼。

3. known_hosts 文件

这是个什么文件呢?一般情况下 windows 下不会产生这个文件,先说说他是干什么的。当我们成功与服务端进行连接时,ssh 会记录服务端的 Host、IP 以及 rsa 文件,当连接过程中出现:

Permanently added '10.0.0.0' (RSA) to the list of known hosts.

如 果你选择 Yes,那这个 known_hosts 文件中就会多出一条记录。windows 是不会自动产生这个文件的,也可能是程序产生了,但是没权限写入,所以我们没有在 .ssh/ 目录下看到这个文件。但如果我们创建了这个文件,会发现里面的内容会随着我们的验证慢慢增加。

搞清楚了这些概念,我们再说说会遇到的问题。

二、常见问题

1. git@xxx.com 输入密钥

当你键入 ssh -T git@xxx.com 这条命令之后,程序提示要你输入 git@xxx.com 的密码,那不用想了,程序没找到你的私有密钥。在哪些情况下会这样呢?

我们在生成这两个密钥的时候,程序可能没有帮我们在根目录下(C:/Users/yourName)新建一个 .ssh/ 文件夹,而他在建立连接的时候会默认寻找 ~/.ssh/id_rsa,如果没有新建一个这样的文件夹很显然是找不到的。你可以在根目录下通过命令行来新建一个文件夹

mkdir .ssh

之所以要用命令行是因为有时候浏览器不让你在文件夹名第一位放点号。

当然也有可能是因为你没有把创建的两个密钥放到 .ssh/ 目录下,而是直接扔在根目录下。

2. Host key verification failed

"Host key verification failed." 相信你也撞到了这个问题,主机的密钥验证失败,主机就是你的机器,密钥验证失败有两个原因,一个是 RSA 做了更改,另一个原因是在 known_hosts 中存在一个缓存的记录,如果确认了 RSA 没有错误,那你就应该去 known_hosts 中删掉对应的那个记录(这个记录可以当做是缓存,是对验证做了一次缓存,缓存的作用是减少验证次数,不需要每次都验证,读取缓存就行了)。

当然,你也可以直接删除这个 known_hosts 文件。

3. Permission denied (publickey)

"Permission denied (publickey)." 这个问题其实和上面的 2 差不多,当你出现过 "Host key verification failed.",然后继续执行程序,如执行 ssh -T git@xxx.com 的时候就会出现这个问题提醒。说到底就是没有找到你的 rsa 私有密钥,或者 rsa 密钥匹配出错。

三、windows 下让人纠结的问题

1. 找不到根目录

生成密钥默认放在 "~/.ssh/" 下,但是在 cmd 下操作会找不到 "~/" 这个根目录,因为这是 windows 不是 linux/unix,有些童鞋可能装了 cygwin,在这个环境下操作可以 "cd ~",git bash 下当然也是可以的。

如果不知道有这个问题的存在,你会碰到上述问题一,程序直接让你输入密码,但不过你输入什么密码都是错误的。输入三次之后状态为 Permission denied,这里的原因就是没找到 ~/.ssh/id_rsa ,cmd 下她根本就不认识 "~/" 这个目录。

2. 多个服务端的维护

很常见的问题。上面我们说到了,程序会默认寻找 ~/.ssh/id_rsa 这个文件,同一目录下显然不能有两个重名文件,也就是说当我们去认证 github 和另外一个 git 服务器的时候,我们需要把两个 rsa 私有密钥的名字换来换去,想用谁就把谁改成 id_rsa。特别麻烦,那肿么办?

之前在网上看到说是对 ssh_config 进行配置,配置内容是:

Host github.comUser boy-aIdentifyFile ~/.ssh/github
Host xxx.comUser boy-bIdentifyFile ~/.ssh/xxx

这里的 "~/.ssh/github" 和 "~/.ssh/xxx" 都是 rsa 文件,文件的命令可以直接改,也可以在开始生成的时候设定,命名对内容没有任何影响。项目的几行代码应该也是十分清晰的,针对不同的 git 服务器,使用不用的 IdentifyFile。

但是你会发现,你的设置毫无用处,因为你把文件名搞错了!在 linux/unix 下可能是使用 ssh_config 这个文件名,但是在 windows 下是使用 config 作为文件名放在 ~/.ssh/ 目录中!

四、小结

这东西我纠结了一个下午,花了将近三个多小时才解决问题,真心快吐血了!说到底就是一个 config 的配置问题,遇到这种问题最快捷的方式并不是在网上疯狂的搜索答案,而是静下心来看看 rsa | git | ssh 的基础知识,了解每个参数及其用途,对症下药!

原文:http://segmentfault.com/a/1190000000430544

转自:git/ssh捋不清的几个问题

git/ssh捋不清的几个问题相关推荐

  1. Mac 环境下连接多个git — ssh方式

    Mac 环境下连接多个git - ssh方式 1.查看当前是否存在ssh ls ~/.ssh/ 看到 id_rsa 与 id_rsa_pub 则说明已经有一对密钥. 2.生产新的公钥,并命名它不于之前 ...

  2. Git SSH Key 生成并添加到github/gitee步骤

    Git SSH Key 生成并添加到github/gitee步骤 在本地生成密钥 大家好,这里是坚果前端小课堂,欢迎大家关注我的公众号,"坚果前端" Git是分布式的代码管理工具, ...

  3. git ssh创建分支_【ssh简单版git-server 1】自建git-server

    环境:centos和ubuntu系统都可以 CentOS release 6.7 git version 1.7.1 git-server 192.168.50.108 git-client 192. ...

  4. git ssh配置文件 服务器_Linux 环境 搭建Git 服务器,并且修改SSH端口使用

    1.环境配置说明 服务器 CentOS 7 + git(git version 1.8.3.1) 客户端 Windows10 + SourceTree 2.安装 Git 服务器端安装: sudo yu ...

  5. ios工程超级无敌详细设置(包括homevrew下载和pod配置,git ssh设置)

    文章目录 前言: git ssh配置 查看是否已配置 重新配置 创建仓库和项目: 新建仓库 创建工程 环境配置 一些介绍 下载Homebrew和cocoapods pod操作 同步代码 同步githu ...

  6. git SSH免密登录

    git系列文章目录 第八章 git SSH免密登录的使用 文章目录 git系列文章目录 前言 一.生成密钥 二.使用步骤 1.使用VSCODE打开.pub文件复制其中的内容 2.打开github或者g ...

  7. Git:SSH 公钥

    Git:SSH 公钥 使用 SSH 公钥验证 创建一个公钥 使用 SSH 公钥验证 通常情况下,访问远程服务器上的 Git 仓库要受到限制.你可能不希望任何人都能读取文件,或者至少不能改动文件吧.在这 ...

  8. git ssh 设置代理服务器_Git代理服务器设置和访问Github

    因为现在工作的网络环境有着非常严格的限制,.可以说,在最近的访问通过代理Github它采取了一些曲折的.也积累了一些相关经验.我们认为有必要注意什么. 符合"不要再发明轮子"宗旨, ...

  9. git ssh 代理_Git通过SSH隧道作为代理

    git ssh 代理 git is a great tool and it is common to have a git server over SSH possibly managed by gi ...

最新文章

  1. 2021-2027年中国医疗旅游业投资分析及前景预测报告
  2. mysql 2003报错_为什么不建议在 MySQL 中使用 UTF-8?
  3. 报错后返回输入参数的界面
  4. 【PAT甲级 链表去重】1097 Deduplication on a Linked List (25 分) C++ 全部AC
  5. python什么软件开发好_python怎样才能学好?python软件开发什么
  6. Leaflet笔记-把leaflet-tilelayer-wmts移植到vue cli中(含思路)
  7. cobbler批量安装linux
  8. 刘备当年是如何面试诸葛亮的?
  9. 聊聊电商系统中红包活动设计
  10. 激光三角测量物体高度
  11. 【Vegas原创】HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法
  12. 【Lintcode】1647. Path Search
  13. Windows下编译LibreCAD
  14. win10的bat文件或者cmd文件关联了文本编辑器导致无法运行
  15. golang算法之鬼谷子问徒
  16. [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例
  17. 一专多能、刻意练习和终身成长
  18. 2021秋招总结(内含笔试面试攻略)
  19. 直面中国市场的新挑战,律商风险数据赋能车险智慧决策踏上新征程
  20. 烂泥:火车头采集器使用GAE代理

热门文章

  1. 信息学奥赛一本通C++语言——1108: 向量点积计算
  2. 树莓派 python 无人机_DIY一个基于树莓派和Python的无人机视觉跟踪系统
  3. linux内核那些事之物理内存模型之SPARSE(3)
  4. Ubuntu18.04.1系统安装mmdetection(含torch、torchvision、mmcv-full)
  5. 【pytorch 】torchvision.transforms.CenterCrop==>从图像中心裁剪图片
  6. [C/C++]记录:使用sprintf_s时第二个参数不严格计算导致栈损坏
  7. 湖北大学数学与计算机科学学院,2017年湖北大学数学与计算机科学学院811数据结构考研题库...
  8. 资源:网页翻译API(文档)
  9. 免费开源B2C电商系统:(ShopXO无需授权,即可商用)- 入门篇
  10. axios.delete()请求方式(含代码)- 应用篇