我知道大部分介绍可能看的云里雾里的,我会在下面实际操作中,讲解每一条命令的写法、以及为什么要写,大家应该就可以大致了解SSH秘钥对是什么意思,又怎么使用了。
整合、参考了以下大佬的思想和简介:
- SSH key的介绍与在Git中的使用
- ssh命令\参数\语法
- but GitHub does not provide shell access 求问解决方法
- vscode源代码管理器(git可视化操作)
- VSCode中使用 GitHub
因为我的了解目的是:
- 知道什么是SSH协议
- 知道什么是SSH秘钥对
- 知道SSH秘钥对怎么与github联动
- 知道VScode和github怎么关联
前提废话: 我写这篇博客的目的不是证明我的内容更好,很多珠玉在前,上面 链接1 写的真的非常全和优秀。但我还要写这一篇的原因在于,对于一个新手,官方的表述,详细的解释,只会让人迷失在一堆一堆的资料里。我这篇的特点在于:有大量的个人理解大白话,以目的为导向的介绍过程。所以很多地方没有展开,因为对于新手,我首先想知道的是:这个东西是什么、有什么用、我需不需要用,要的话到底怎么用?如果看完这篇能解决上面的问题,那就请给我点赞~
一、什么是SSH
1.官话
Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议。通过加密保证了数据的保密性和完整性。SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用户。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。防止中间人攻击。
2.大白话
因为传统的FTP、Telnet协议,网页输入的表单数据(账号、密码、用户数据)递交到远程服务器的时候,会把它们明文暴露传输,容易导致信息泄露。
举个例子: 抗日的时候有奸细和卧底,那他们要传递消息,不可能白字黑字的把 卧底身份和情报信息,也就是账号、密码、用户数据,写在纸上进行传递吧。万一被截获了,这个情报就失效了。那好办,就进行加密,我们制定一套加密规则,只有自己和正确的传递对象才知道这套规则进行破译,其他人拿到就傻眼了,他就无法完成至少3件事:
- 知道情报具体内容(就是窃取你的数据)
- 假冒你骗你队友。(就是骗远程服务器)
- 假冒你队友骗你。(就是骗客户端,就是个人电脑)
二、什么是SSH秘钥对
最直观的作用:让你方便的登录到 SSH 服务器,而无需输入密码。由于你无需发送密码到网络中,SSH秘钥对被认为是更加安全的方式。
原因是:SSH利用SSH Key来进行前面提到的基于密钥的安全验证。
简单来说:SSH key就相当于加密方法,这个加密方法,见名知其意,钥匙和锁配对,分别给我这个情报员和接头人。
生成和使用SSH key方法:
- 在客户端生成SSH key(密钥对:公钥和私钥)
- 在服务端的配置文件中加入你的公钥。(比如需要在GitHub中粘贴生成的公钥)
三、具体操作
1. 生成秘钥对 SSH key
命令关键词:ssh-keygen
命令一般写法:ssh-keygen -t rsa -C "你的邮箱"
解释:
- -C 添加注释,一般是邮箱
- -f 指定保存秘钥的文件名,不指定就默认
~.ssh/id_rsa
,默认就会覆盖上一次默认生成的秘钥对 - -t 创建的秘钥类型,支持rsa和dsa
- 其它:问搜索引擎去
运行效果:
注意:命令执行过程中,有一个passphrase要设置。passphrase 设置密码,保护私钥的密码,一般不设置,记不住;这个就相当于给你的钥匙再配个钥匙,我想除非你保管着金库,否则听起来就不是很有必要对吧。
在默认生成秘钥对的地址下会出现上面这些东西(如果找不到该文件夹请查看-打开隐藏项目
):
- id_dsa 私钥(钥匙)
- id_dsa.pub 公钥(锁)
2. 与github联动
- 打开github,点击头像,进入setting,看到
SSH and GPG keys
- new一个SSH key
- title随便起啦,key的话就是
记事本打开-粘贴-上面id_rsa.pub文件的所有内容
- 之后会要求你验证一次用户密码
- 解释:公钥就是锁,要交给github服务器,验证密码是为了证明这把锁确实是本用户给的~
3. ssh-agent命令
①官话
一种控制用来保存公钥身份验证所使用的私钥的程序。简单来说,就是一个秘钥管理器。运行ssh-agent,使用ssh-add将私钥交给ssh-agent保管,其他程序进行身份验证时可以交给ssh-agent完成。
②大白话
就相当于本来这把钥匙自己一个人用,但是有的时候别的人来访问家里,没钥匙进不去。那我们可以把钥匙拿给物管或者门口的鞋子里,想进屋可以找他们要,就是委托、托管~如果你有托管的需求,执行以下命令:
ssh -v git@github.com
//-v意思是终端详尽输出log,后面是github域名,也可以跟ip地址ssh-agent -s
//但是window自带ssh-agent报错:unable to start ssh-agent service, error :1058
ssh-add ~/.ssh/id_rsa
//托管秘钥,window不认识~,请自行写上绝对地址(成功会提示 Identity added)ssh -T git@github.com
//设置完成后的连接测试
1058报错解决方案:
- 管理员权限打开 windows power shell
- 执行:
Set-Service -Name ssh-agent -SttartupType automatic
补充:命令1输出:but GitHub does not provide shell access
对应解释: but GitHub does not provide shell access 求问解决方法
原话粘贴:
在使用ssh加公钥认证时会输入 ssh -T Github.com,认证成功后会输出如下Log。
“but GitHub does not provide shell access ”这句话的意思是,GitHub不提供shell(ssh)访问/接入权限。
ssh -T选项的意思为,不分配伪终端。
当你在使用ssh协议连接到自己或者其他服务器时,本地终端会显示命令提示符,你可以在上面操作输入命令ls等。
结合上面几点,这句话的意思即为你无法使用ssh协议直接登录github,在github服务器上建立一个伪终端,并进行操作。
所以,这句提示并不是一个错误,而是github输出的一句提示语。
同样你可以在本地使用ssh协议进行git相关操作,并提交到github,没有任何影响。
4、为什么我们需要ssh
一个是为了加密我们的数据;第二个是为了只用登陆一次后即可访问远程服务器;
对我们来说,毕竟新手哪有什么重要的数据放到github(又不是大公司,也不是编程大拿)???我们的诉求肯定是访问远程服务器时,不要每次都管我要密码,我懒得。因为vscode连接github,两者融合现在也做的比较好了,我不可能每次vscode打开项目,编辑一下, 同步到github,每次都要输密码,很烦的哇。那么在这个时候,我们就需要按照上面的步骤ssh连接,一次就好,省密码到天荒地老~
四、与vscode联动(完整过程)
-
VSCode 默认已安装Git。输入
git --version
如果显示版本号,则安装成功。 -
在GitHub上新建一个仓库。例如:myrepo
-
在本地新建一个文件夹,作为VSCode代码的工作文件夹。例如:mycode
-
mycode既是VSCode的代码工作文件夹又应该是Git的本地仓库。在命令行方式下进入mycode,输入git init
-
生成秘钥。继续在该目录下输入:
ssh-keygen -t rsa -C "myname@mymail.com"
,命令执行完毕会生成一个名为id_rsa.pub的文件。利用文本编辑器打开该文件,全文复制。 -
打开GitHub上,进入setting,新建SSH keys,将id_rsa.pub中的内容粘贴进去即可。
-
绑定本地文件夹和GitHub仓库:
git remote add . git@github.com:myname/myrepo.git
(对了,记住是ssh连接) -
设置完成后可以做一下连接测试:
ssh -T git@github.com
-
先进行一次拉取,再进行一次推送:(关于本地仓库和远程仓库的联动,不太清楚流程可以看我另一个回答)
- git pull --rebase mycode master
- git pull mycode master
- git push --force mycode master.
- 上述配置都进行完成后,就可以利用VSCode打开mycode文件夹进行相关操作。此时任何在该文件夹下出现的改变,VSCode的“源代码管理”图标上都会出现相应发生改变的文件的数字。点击“源代码管理”图片后,会列出来所有发生改变的文件名称,点击右上角的…,进行“提交”操作。
- 提交完毕后检查GitHub的myrepo会发生相应的变化。如果没有变化,在VSCode中打开控制台(ctrl+`)选择“输出”,看是否有相关的错误提示,根据错误提示信息进行调整。