git/ssh捋不清的几个问题
主要是 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捋不清的几个问题的更多相关文章
- Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )
在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...
- 如何生成git ssh key
公司有自己的git版本控制,自己注册账号后,管理员同意,就可以查看项目代码了,但是要克隆的话需要在本地生成git ssh key 一.进入.ssh文件夹. cd ~/.ssh 若没有.ssh文件夹,则 ...
- Git SSH公钥配置
https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...
- git ssh 22 端口不可用时通过https 443 端口配置git ssh
Using SSH over the HTTPS port Sometimes, firewalls refuse to allow SSH connections entirely. If usin ...
- Git SSH密钥对生成以及多个SSH存在情况配置
一.使用Git Bash 生成一个新的SSH密钥 1. 打开 Git Bash. 2. 邮箱设置粘贴下面的文字,替换成为你自己的邮箱. Github SSH 1 $ ssh-keygen -t rsa ...
- ssh-keygen生成git ssh密钥
title: ssh-keygen生成git ssh密钥 date: 2018-05-07 08:49:21 tags: [git,ssh-keygen] --- ssh-keygen生成git ss ...
- git/ssh备查文档
配置多个ssh key: 待更新 git速查表: git remote set-url origin(远程仓库名称) https://xxxxx/ProjectName.git 从ssh切换至htt ...
- 关于 Git SSH 使用的项目实践
Git 是分布式的代码管理工具,远程的代码管理是基于 SSH 的,所以要使用远程的 git 则需要SSH的配置. 一.简述 访问 Git 仓库可以使用 SSH Key 的方式,首先需要生成 Key. ...
- [转载] Ubuntu 12.04下安装git,SSH及出现的Permission denied解决办法
如何安装ssh http://os.51cto.com/art/201109/291634.htm 仅需要阅读至成功开启ssh服务即可 http://www.linuxidc.com/Linux/20 ...
随机推荐
- 6SQL SERVER视图/索引
一.视图 1.视图概念 ①视图是包含由一张或多张表的列组成的数据集.该表中的记录是由一条查询语句执行后所得到的查询结果所构成的. ②视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数 据,其结构 ...
- iOS UITableViewCell的分割线向左延长15(cell长度为全宽)
iOS7情况下: tableView.separatorInset = UIEdgeInsetsZero; iOS8.9情况下: 首先在viewDidLoad方法中加上如下代码: if ([table ...
- POJ2632
#include<stdio.h> #include<string.h> #include<algorithm> #include<cmath> usi ...
- MySQL创建一个具有root权限的用户
grant all privileges on *.* to 'user'@'host' identified by 'password' WITH GRANT OPTION MAX_QUERIES_ ...
- JAVA求解线性方程组-列主元高斯消去法
package MyMath; import java.util.Scanner; public class Gauss { /** * @列主元高斯消去法 */ static double x[]; ...
- 利用(Tcmalloc) google-perftools优化Nginx和MySQL性能
一.安装libunwind wget http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz 本地下载:htt ...
- oracle flashback功能
2). 检查Flashback 功能, 缺省时功能是关闭的. SQL> select name, current_scn, flashback_on from v$database; NAME ...
- vue 2 滚动条加载更多数据实现
解析: 判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop.clientHeight.scrollHeight. scrollTop为滚动条在Y轴上的滚动距离. clientHeigh ...
- 移动web前端小结(一)--摘自小鹿_同学
一.框架 框架:Bootstrap+HTML5 Boilerplate. 两个框架整合到一起可以看一下这位大神的文章:<使用 Bootstrap 和 HTML5 Boilerplate 开始一个 ...
- SharePoint 2013开发入门探索(二)- 列表操作
我们如何用代码对SharePoint列表做些例如增删改查的操作呢?如果您的程序可以部署到服务器上,就可以使用 服务器对象模型,因为服务器对象模型提供的功能最多,限制最少:否则可能要选择客户对象模型等其 ...