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

本文地址:http://www.cnblogs.com/hustskyking/p/problems-in-git-when-ssh.html,转载请注明源地址。

一、概念的解释

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.com
User boy-a
IdentifyFile ~/.ssh/github
Host xxx.com
User boy-b
IdentifyFile ~/.ssh/xxx

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

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

四、小结

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

补充:

  1)“ssh-add -l” 报错 “Could not open a connection to your authentication agent.”

操作:ssh-agent bash -login -i

  2)“Are you sure you want to continue connecting (yes/no)?” 选择 yes ,否则会报错“fatal: Could not read from remote repository.”

  3) config 文件貌似没啥用,IdentifyFile path/to/rsa 这个地方报错。

git/ssh捋不清的几个问题的更多相关文章

  1. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...

  2. 如何生成git ssh key

    公司有自己的git版本控制,自己注册账号后,管理员同意,就可以查看项目代码了,但是要克隆的话需要在本地生成git ssh key 一.进入.ssh文件夹. cd ~/.ssh 若没有.ssh文件夹,则 ...

  3. Git SSH公钥配置

    https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...

  4. git ssh 22 端口不可用时通过https 443 端口配置git ssh

    Using SSH over the HTTPS port Sometimes, firewalls refuse to allow SSH connections entirely. If usin ...

  5. Git SSH密钥对生成以及多个SSH存在情况配置

    一.使用Git Bash 生成一个新的SSH密钥 1. 打开 Git Bash. 2. 邮箱设置粘贴下面的文字,替换成为你自己的邮箱. Github SSH 1 $ ssh-keygen -t rsa ...

  6. ssh-keygen生成git ssh密钥

    title: ssh-keygen生成git ssh密钥 date: 2018-05-07 08:49:21 tags: [git,ssh-keygen] --- ssh-keygen生成git ss ...

  7. git/ssh备查文档

    配置多个ssh key: 待更新 git速查表: git remote set-url origin(远程仓库名称) https://xxxxx/ProjectName.git  从ssh切换至htt ...

  8. 关于 Git SSH 使用的项目实践

    Git 是分布式的代码管理工具,远程的代码管理是基于 SSH 的,所以要使用远程的 git 则需要SSH的配置. 一.简述 访问 Git 仓库可以使用 SSH Key 的方式,首先需要生成 Key. ...

  9. [转载] Ubuntu 12.04下安装git,SSH及出现的Permission denied解决办法

    如何安装ssh http://os.51cto.com/art/201109/291634.htm 仅需要阅读至成功开启ssh服务即可 http://www.linuxidc.com/Linux/20 ...

随机推荐

  1. ue4 NewObject/StaticConstructObject_Internal/StaticAllocateObject/FObjectInitializer:对象创建和初始化

    UObject是一套很复杂的体系,之前读ue3代码时曾分析过其类型系统实现,主要是与UClass间的关系 现在转到ue4,发现那一块其实差不多,于是再重点备忘一下UObject本身的创建和初始化过程 ...

  2. ASP.net MVC中页面跳转

    @Html.ActionLink("Home Name", "Index", "Home")Home name 是 跳转链接的名Index  ...

  3. PHP使用内置函数生成图片的方法详解

    原文地址:http://www.poluoluo.com/jzxy/201605/475301.html 本文实例讲述了PHP使用内置函数生成图片的方法.分享给大家供大家参考,具体如下: 第一步:创建 ...

  4. 如何解决pycharm输入中文报错问题

    在pycharm中的python文件中输入中文会报错SyntaxError: 问题解决方法在文件开头添加 : # -*- coding:utf-8 -*- 每次添加都很麻烦,一劳永逸解决此问题的方法: ...

  5. 类Collections的静态方法

    类Collections的静态方法 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成. 排序 static <T extends Comparable& ...

  6. 日志——JSON的相关方法

    http://www.cnblogs.com/henryxu/archive/2013/03/10/2952738.html JSON  jar包: commons-lang.jar commons- ...

  7. crack.vbs病毒,优盘里所有文件全变成快捷方式

    去了一趟学校打印店,用优盘copy打印了点东西,当时在打印店电脑里打开优盘的时候里面就变成了快捷方式,但没怎么在意.回来之后在自己电脑上居然也这样了.网上一搜是中了crack.vbs病毒了.格式化优盘 ...

  8. redis命令总结

     Redis命令总结 redis 127.0.0.1:6379> info  #查看server版本内存使用连接等信息 redis 127.0.0.1:6379> client list  ...

  9. javascript code snippet -- 保留小数点位数

    js1.5以上可以利用toFixed(x) ,可指定数字截取小数点后 x位 for example : //round "original" to two decimals var ...

  10. Slide-卡盘效果

    <div style="width:950px;height:705px;"> <div class="J_TWidget" data-wid ...