Windows 常用软件汇总

工欲善其事,必先利其器。本文以 大众篇,进阶篇,开发篇,游戏篇 介绍不同人员电脑上必装或可装的软件。

==软件安装路径请不要包含中文!!!!!!!!!!!!!==

大众篇

一般我们买一台新电脑,除了操作系统之外就只有少数系统自带的软件,当然某些组装机店家可能会帮忙装一些常用软件,但我个人很不喜欢他们预装软件(包括生产商),所以拿到一台新电脑,装上操作系统之后就得开始我们漫长的装机工作。

大众篇列举的是大部分电脑用户(包括电脑小白)可能需要的一些软件。

一个顺手的输入法

首先,无论你要在电脑上做什么,都离不开打字,所以最首要的任务就是安装一个适合自己的输入法。windows 自带有拼音输入法,win10 还有自带有五笔输入法,好不好用因人而异,可以试着用,用不习惯的话还是自己去网上下载一个别的输入法吧;打开系统自带的浏览器 ie 或 edge,然后搜索下载安装(当然首先电脑要能上网)。

比较大众且好用的输入法应该是搜狗输入法,有拼音和五笔,根据自己爱好选择,这是搜狗五笔输入法的官网:http://wubi.sogou.com。

大部分输入法切换输入法的快捷键是 ctrl+shift,一般除了输入法之外还会启用一个美式英文键盘,用于英文输入;如果是美式键盘+第三方输入法的方式,则直接使用 ctrl+shift 切换即可,如果是 win10 的美式键盘+微软拼音或微软五笔,则美式键盘和输入法为英文和中文两种语言,要使用 win+space 来切换语言,ctrl+shift 仍用于切换输入法。

一个好用的浏览器

毫无疑问,无论我们要装什么软件都得上网去下载,所以安装一个好用的浏览器是我们第二件要做的事。windows 自带的浏览器,ie explorer 基本没人用,新推出的 edge 虽然比 ie 好些,但也还是用不习惯。比较常用的浏览器有 chrome 和 firefox,无论是不是电脑行业从事人员,都建议使用这两个浏览器之一,至于 360,百度,QQ 之类的还是算了,除了广告多些,体积大些就没别的什么”优点“了。

我个人比较习惯用 chrome,下载安装之后建议首页设置为新标签页,或者搜索引擎页面,或者另一个简洁的网站地址,不要设置那些乱七八糟的导航,只会增加你电脑下到垃圾软件和病毒的可能性。这是谷歌官方的中文地址:https://www.google.cn/intl/zh-CN/chrome

如果有谷歌账号的话,登录之后就可以在不同设备的 chrome 上同步书签、历史记录、扩展工具、外观、保存的密码等设置。

搜索谷歌浏览器的时候可能会搜到一些和 chrome 很相似的浏览器,比如极速浏览器和双核浏览器,这是兼容 ie 内核和 chrome 内核的双核浏览器,但它们和 chrome 不是同一个东西,所以如果一台设备装的 chrome,另一台装的是另外的浏览器,那么是无法进行同步信息的,因为登录的账号不一样,我新电脑一开始装的是双核浏览器,然后登录的时候居然得微信扫码。

一个强大的播放器

现在输入法和浏览器都有了,可以为所欲为地下载你喜欢的软件了。对大多数人来说,电脑可能更多的是娱乐作用,所以一个强大的视频播放器和音频播放器就成了当前首要任务。windows 自带的 media player 真的很差,windows 10 新推出的“电影和电视”好些,但功能仍不够强大,界面也不好看。

很多人喜欢下载那些网络视频提供商的客户端,比如腾讯视频、优酷视频等,这些客户端自带视频播放器的,功能也还可以,大部分视频都能解码播放。但我不喜欢这些客户端,这不是纯粹的播放器,只会显得臃肿,如果要看网络视频,一个浏览器足矣。当然,各有喜好,这里只是推荐两个好用的纯粹播放器 kmplayer 和 potplayer,这两个播放器出自同一位作者之手,功能都很强大;我只用过 potplayer,也说不好哪个好,但原作者先做的 kmplayer,接下来跳槽做的 potplayer,之后就不再维护 kmplayer 了,所以硬要说哪个好已经一目了然了。

这是 potplayer 官方的中文下载地址:http://potplayer.daum.net/?lang=zh_CN。

至于音频播放器,就直接下那些提供商的客户端吧,音乐不同于视频,在浏览器上直接听音乐限制太多,体验也很不爽,而且这些音乐客户端没有视频客户端那么臃肿杂乱,体验还是很不错的。比较流行的几款音乐客户端都可以,网易云音乐、QQ音乐、酷狗音乐、虾米音乐等等,网易云音乐最近比较流行,但其音乐库非常匮乏是个致命问题。

解压缩工具

其实以前 windows 预装的老牌软件 winrar 就够用了,但这东西现在好像是要收费的,每次打开都会弹一个购买的页面,虽不影响使用但也很烦,所以忍受不了就重新装一个解压软件吧,比较 7zip,其优点就是体积非常小,安装文件只有 1m,安装之后也才 5m。

7zip 官方下载地址:https://www.7-zip.org。

下载工具

一般的下载直接在浏览器完成就行了,但有时会需要下载一些其它格式来源的内容,比如磁力链接,就得用到特别的下载工具了。国内最知名的应该是迅雷下载,但国内的软件商就一个通病,喜欢把一个软件搞得很臃肿,除了核心功能之外一堆没用的东西,一个操作不当就给你下个游戏盒子,再给你存几个“一刀999”的页游链接;另外,不开会员真的只能龟速下载。

所以在用了几年迅雷之后,开始找替代的软件,一个常用的是 Free Download Manager,简称 FDM,它支持FTP,HTTP(S),还有 BT 下载,还支持远程控制下载,还能直接下载网上的视频,要在 chrome 上装插件,但这功能好像并不好用。

FDM 下载地址:https://www.freedownloadmanager.org/zh/

FDM 只是知名度高一些,但我用过之后觉得并不是很好用,所以推荐另一个更好用的视频下载工具,Apowersoft 公司的 Video Download Capture,中文名叫视频下载王,中文名是有点俗,但功能是真的强大。这个软件包含了迅雷所有功能,BT 下载,边下边播,还可以直接通过一个 URL 下载网上的视频,国内国外都可以,功能比 FDM 好用。另外,这个软件还带视频转换和录屏功能。

Video Download Capture 下载地址:https://www.apowersoft.com/video-download-capture.html

虽然网上有很多替代的产品,但要说简单方便还是迅雷,看个人选择吧。另外,如果百度云用得多的话,还是下一个百度云客户端吧。

企鹅帝国

接下来就是企鹅家族的必备产品了,QQ 和 WeChat,这里推荐一下腾讯一直在推的简洁版 QQ,Tim,确实比 QQ 简洁了很多,当然开始用的时候会有些不习惯,习惯了就挺好;当然使用 QQ 会更有怀旧情怀。

广告拦截工具

我们生活在一个网络发达的时代,也生活在一个广告满天飞的时代,这些广告就像垃圾一下污染着我们的上网环境,阻挡着我们正常看视频,所以一个去广告的工具就显得十分重要。我之前上大学的时候用的是 ADSafe,但后来发现它不行了,新版本已经不能去视频广告了,虽然我原来电脑装的旧版本还能工作,但网上已经找不到旧版本下载了。

所以这里推荐另一个软件,阿呆喵(ADM),其体积比 ADSafe 小很多,用起来也挺不错的。阿呆喵下载地址:http://www.admflt.com/

另外,在 chrome 安装一个 ADBlock 插件也能有效去网页广告。

文件搜索神器

好了,娱乐部分介绍完了,接下来该介绍些“有用”的东西了。Linux 系统自带搜索命令,可以很容易地在整个文件系统中搜索某个文件;但 windows 没有,如果要搜索某个文件,只能先找到所有的文件夹,在进行查找,而且查找速度非常的慢。

这里介绍一个搜索神器,只要输入文件名就可以很快地找到其路径,只要是电脑上有的文件,都能被找到,包括隐藏文件,而且速度非常的快。这个神器就是 Everything,下载地址:https://everything.en.softonic.com/

记得常做笔记

学如逆水行舟,不进则退。好记性不如烂笔头。互联网时代的电脑使用者,不在电脑上记点什么似乎说不过去吧,特别是办公室人员。使用记事本来做笔记是一件特 low 的事,用 word 似乎还不错,但不是写笔记的最佳选择,因为有专门的笔记工具。较为出名的有印象笔记和有道笔记,个人推荐有道笔记,扁平化的界面感觉更好看,功能看起来也更简洁,而且能随时随地同步到远程服务器,在这个机器上写完,换个机器又可以继续写。印象笔记应该也可以同步到服务器,但印象笔记好像不支持 markdown,而有道支持,markdown 不是一个工具或软件,应该是一种规范,或者说是一种语法或语言;使用 markdown 可以非常轻松地写出排版简洁又漂亮的文章,还可以随时插入图片、引用、代码、链接等。这篇文章正是使用有道笔记+markdown 写的。

有道笔记下载地址:https://note.youdao.com/download.html
Markdown 学习地址:https://github.com/younghz/Markdown

如果不想下载客户端的话,也可以使用网页版 https://note.youdao.com/web

本文后期已从有道笔记移植到个人博客网站,所以不需要任何笔记工具了,只需要一个能编辑 markdown 文件的编辑器即可,比如非常好用的 vscode。关于如何搭建个人博客,直接网上搜索教程即可,或者参见我上一篇文章 github + hexo 搭建个人博客

电脑管家

刚上大学那会用过一段时间 360 电脑管家,给我的感觉就是特别卡,还是各种全家桶真让人头痛。电脑管家最常用的两个功能就是病毒防杀和电脑加速,事实上病毒防查有 Windows 自带的 Windows Defender 就够了,运行加速可以使用系统的任务管理器,可以设置启动项,杀掉进程,关停服务,直接右键点击底边的任务栏就行,然后再装个垃圾清理工具就行了。推荐使用 cccleaner,这是个收费软件,功能很全,也有免费版,但功能很有限。

cccleaner 下载地址:https://www.ccleaner.com/

如果需要安装驱动的话还是推荐 360 驱动大师,虽然 360 全家桶很让人讨厌,但单个驱动软件还可以,当做像其它的驱动人生,驱动精灵也行,反正都差不多。

硬件检测

系统自带的 设备管理器 能够看到各个硬件的运行情况和基本信息,如果要看更详细的信息就得安装第三方软件,特别是买新硬件的时候,总要测一下性能。下面介绍几个常用的软件。

第一款软件是 AIDA64,这是 Windows 设备管理器的加强版,其布局和设备管理器其它一致,但显示的东西更多。
第二款是 CPU-Z,顾名思义就是专门检测 CPU 的,当然除了 CPU(处理器)之外,还有主板、内存、显卡的基本信息。
第三款是 GPU-Z,主要用于查看显卡的详细信息。
第四款是 AS SSD Benchmark,主要用于 SSD 跑分。
最后是 HDtuneDiskmark,这两个主要用于硬盘压力测试,一般买二手硬盘才需要,前者测试硬盘通电时间,后者测试磁盘读写速度。

文档编辑

microsoft office 或 kingsoft wps。

思维导图

有时候文档无法很好地表达我们想表达的东西,这时候使用思维导图也许能有事半功倍的效果。思维导图最常用的是 XMind,这是官方网站中文官方网站

截图工具

windows 自带的截图工具其实也可以,QQ 的截图功能也挺方便的,使用快捷键 Ctrl+Shift+A 即可截图,但功能终究不够强大,这里再推荐两个第三方截图工具,其最大的优点是会将截图放在剪贴板中,直接显示在屏幕上,当我们切换到其它软件时截图还在,很方便查看。

第一个是 SETUNA,这个软件足够小巧,才 2m 不到,而且免安装,单个 exe 文件直接运行。SETUNA 官网已挂,目前只有他人维护的 github 项目,这是软件的源代码,需要自己编译,如果不懂编程的可以从网盘下载,提取码 bvct

第二个是 Snipaste,这个软件稍微大些,但功能也更强大,除了能让截图驻留在屏幕上,还能直接将剪贴板的图像、文本、颜色信息也转换成图片并显示在屏幕上。通过官网 下载软件及查看教程。

另外,如果要制作 gif 动态图,可使用 GifCam,这个软件同样不到 2m 且名安装,单个文件运行,足够小巧方便。

垃圾清理

ccleaner 足够简洁,使用也方便,功能也足够强大,不仅能清理垃圾,修复注册表,还有磁盘分析、软件卸载等实用工具。这是官网地址

进阶篇

进阶篇介绍一些相对高级一些的软件或者计算机从业人员(比如码农)会用到的工具。

文件对比工具

Beyond Compare 是一款很好用的文件对比及文件夹对比工具

Windows 远程连接

SSH 远程工具

SSH 全称为 Secure Shell,是一种网络协议,用于计算机之间的加密登录。SSH 协议使用加密来保证客户端(本地主机)与服务端(远程主机)之间的连接安全,所有的用户认证、命令、输出和文件传输都会被加密。SSH 工作的过程如下图

SSH

  • 首先本地主机发送连接请求给远程主机
  • 远程主机发送自己的公钥给本地主机
  • 本地主机用收到的公钥加密登录密码发送给远程主机
  • 远程主机收到加密后的密码之后使用自己的私钥进行解密
  • 密码验证正确本地主机就连接上远程主机了

下载 SSH Client

“中间人攻击”

SSH 是一种网络安全协议,可以防止登录信息在传输的时候被中途截获,因为登录是使用远程主机的公钥加密过的,即使被截获没有远程主机的私钥也是无法破获的。私钥顾名思义就是私有的,只有远程主机自己知道,除此之外没人知道,即使是合法的远程连接者(也就是我们的本地主机)也不会知道,否则就不是私钥了。

使用 SSH 协议进行远程登录,这个过程本身是安全的,但还是会有一个安全风险,就是所谓的“中间人攻击”。“中间人攻击”是指攻击者扮演远程主机与本地主机之间的中间人,使得本地主机无法正确与远程主机通信。首先,攻击者截获本地主机发送给远程主机的登录请求,然后发送伪造的公钥(它自己的公钥)给本地主机;然后,本地主机收到公钥之后并不知道是伪造的,所以把自己的密码使用公钥加密之后发送出去,攻击者再截获这个密码,使用自己的私钥进行解密,这样攻击者就得到了本地主机的密码;最后,攻击者就可以使用截获的密码与远程主机进行通信了,还可以继续与我们的本地主机进行通信,扮演无耻又无人知晓的“第三者”。

SSH 是怎样解决“中间人攻击”的呢?提供一个凭证,然后让本地主机自己去判断。本地主机第一次连接远程主机时,系统会提示这个远程主机的真伪无法确定,同时给出远程主机的公钥指纹;然后我们可以比对这个指纹和远程主机的指纹是否一致,一致就输入 yes 进行连接,不一致则说明被“中间人”攻击了,则输入 no 取消连接。连接成功之后会把这个远程主机的信息记录在 ~/.ssh/know_hosts 中,之后再连接的时候就不会再检查远程主机的指纹了而是直接登录。

1
2
3
The authenticity of host 'gitlab.xxx.com (192.168.0.xxx)' can't be established.
ECDSA key fingerprint is SHA256:Mu7Sxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?

我们如何知道远程主机的公钥指纹呢?一般公开的远程主机都会在网上贴出自己的指纹,如果是我们自己的远程主机,也可以登录远程主机,然后执行指令 ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 来获取。

口令登录

SSH 协议主要用于远程登录,在本地主机使用 SSH Client 登录到远程主机,登录成功之后就可以在本地操作远程主机了,有点类似 windows 的远程登录。使用 SSH 进行远程登录有两种方式,一种方式是普通的口令登录,另一种是安全性更好更便捷的公钥登录。口令登录要求用户提供远程主机的用户名和密码,远程主机验证通过之后就能正常登录了,这个过程跟最开始讲的一样,使用远程主机的公钥进行加密,再使用远程主机的密钥进行解密。使用 SSH 进行远程登录的命令是

1
$ ssh -p [portid] user@host

SSH 连接默认的端口号是 22,如果使用默认的端口号则可以忽略不写

1
$ ssh user@host

如果本地主机用户名和远程主机用户名一致,则用户名也可以省略不写

1
$ ssh host

之后会提示输入用户密码,ip 地址,端口,用户名和密码都正确就能连接成功。

公钥登录

口令登录需要本地主机提供登录的用户名(可省略)和密码。每次登录都得输入密码,有些麻烦,SSH 提供了另外一种登录方式,“公钥登录”。公钥登录与口令登录刚好相反,口令登录使用远程主机公钥进行加密,再使用远程主机私钥进行解密;而公钥登录使用本地主机私钥进行加密,再使用本地主机的公钥进行解密。首先把本地主机生成的公钥保存在远程主机上,然后本地主机请求登录的时候远程主机会发送一串随机字符串下来,本地主机收到之后使用自己的私钥进行加密发送回远程主机,远程主机收到加密后的字符串使用本地主机提供的公钥进行解密,解密之后的字符串与源字符串一致则认为用户是可信的,直接允许登录而不用再提供密码。

公钥登录也存在“中间人攻击”的风险,解决方案也是一样,第一次登录的时候终端会显示远程主机的公钥指纹,用户确认之后才能进行登录。

使用公钥登录之前要把本地主机的公钥放在远程主机上,如果本地没有密钥,则要先生成一个

1
$ ssh-keygen -t rsa -C "ljx" -f "/c/Users/linjinxin/.ssh/xxserver/id_rsa"
  • -t 参数指定密钥加密的方式,默认就是 rsa,可以省略不写;
  • -C 是指定一个说明,这个说明会附加在公钥的最后,一般是写我们的用户名,如果省略不写的话则默认为 用户名@电脑名,比如我的就是 linjinxin@LAPTOP-4NLDJKB6
  • -f 指定私钥的存放文件名(公钥的文件名在私钥文件名后面加上.pub),也可以先不指定这个参数,在命令执行之后再指定;默认文件名为 ~/.ssh/id_rsa,这里的 ~ 路径在 windows 上是指 /c/Users/username,但有时候 ~ 好像识别不了,如果识别不了就写完整路径吧。

这三个参数都可以省略,则命令简写为

1
$ ssh-keygen

如果文件已存在,则会提示密钥已存在,询问是否重新生成,输入 y 则继续,n 则退出

1
2
3
Generating public/private rsa key pair.
/c/Users/linjinxin/.ssh/xxserver/id_rsa already exists.
Overwrite (y/n)? y

如果前面没有指定私钥存放文件,则这里会提示输入文件名,如果不写则使用括号里的默认文件名

1
Enter file in which to save the key (/c/Users/linjinxin/.ssh/id_rsa):

之后会提示输入私钥的口令,这个口令是保护私钥安全的,有了这个口令之后,别人登录你的电脑也看不到私钥,除非它知道这个口令,这个口令可以为空,默认不写就为空

1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

之后密钥就生成了,会在 ~/.ssh/xxserver 目录下生成两个文件,id_rsa 为私钥文件,id_rsa.pub 为公钥文件。接下来把公钥复制到远程主机,使用命令

1
$ ssh-copy-id user@host -i ~/.ssh/xxserver/id_rsa.pub user@host

-i 指定要复制到远程的公钥文件,注意不能加引号,如果省略不写的话,默认会把 ~/.ssh 目录下的所有 .pub 文件都复制到远程主机,所以如果本地只生成了一个密钥,则这个参数可以省略不写;如果生成了多个密钥,又只要复制一个公钥到远程的话,就必须指定要复制的公钥文件。

ssh-copy-id 做的事就是先使用密码登录的方式登录到远程主机,然后把指定的本地公钥文件的内容复制到远程主机 /username/.ssh/authorized_keys 文件中,以追加的方式写入,所以不会覆盖掉别人添加的公钥。如果远程主机 authorized_keys 文件不存在,则会先创建一个再写入,整个命令等价于下面这个命令

1
ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/xxserver/id_rsa.pub

先使用 ssh user@host 连接到远程主机,然后执行 xxx < ~/.ssh/xxserver/id_rsa.pub 将本地公钥内容重定向到远程,然后在远程执行命令 mkdir -p .ssh && cat >> .ssh/authorized_keys 创建目录 .ssh (如果不存在的话)并把公钥的内容重定向追加到 authorized_keys 文件中。

输入正确密码之后出现下面提示,则表示公钥已正确保存到远程主机上

1
2
3
4
5
6
root@1xx.xx.xx.xx's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@1xx.xx.xx.xx'"
and check to make sure that only the key(s) you wanted were added.

这时候再执行 ssh root@1xx.xx.xx.xx 应该能直接登录到远程主机了,不需要输入 root 用户的密码了,然而事实是还会提示你输入密码,具体原因看下一节。登录之后可以使用命令 vim /root/.ssh/authorized_keys 查看我们添加的公钥,如果有多个公钥,则这个文件会有多行,可以看到有一行和我们本地主机的公钥是一致的,说明这个公钥是我们复制上去的。

私钥生效

把公钥复制到远程之后再进行登录,还是要求我们输入密码,这是因为本地私钥没有“生效”。虽然我们本地已经生成了私钥,远程也有了对应的公钥,但默认本地私钥是没有添加到 ssh 的,也就是不会生效的,所以登录的方式还是口令登录而不是公钥登录。要想使用公钥登录的方式登录,就必须让私钥在 SSH 终端生效,执行命令

1
2
$ ssh-add ~/.ssh/xxserver/id_rsa
Could not open a connection to your authentication agent.

提示无法连接代理进程,这是因为 windows 默认不会启动 ssh-agentssh-agent 是管理 SSH Keys 的一个代理,对 SSH 私钥的管理都是通过 ssh-agent,因此我们要先启动这个代理

1
$ ssh-agent bash

启动 ssh-agent 之后,就可以使用 ssh-add 来添加删除私钥了,这里的添加删除是指使私钥生效或不生效,不是修改我们的私钥文件。查看 ssh-add 的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ssh-add -h
ssh-add: unknown option -- h
usage: ssh-add [options] [file ...]
Options:
-l List fingerprints of all identities.
-E hash Specify hash algorithm used for fingerprints.
-L List public key parameters of all identities.
-k Load only keys and not certificates.
-c Require confirmation to sign using identities
-t life Set lifetime (in seconds) when adding identities.
-d Delete identity.
-D Delete all identities.
-x Lock agent.
-X Unlock agent.
-s pkcs11 Add keys from PKCS#11 provider.
-e pkcs11 Remove keys provided by PKCS#11 provider.

默认不使用参数就是添加私钥

1
2
$ ssh-add ~/.ssh/xxserver/id_rsa
Identity added: /c/Users/ljx0832/.ssh/xxserver/id_rsa (/c/Users/ljx0832/.ssh/xxserver/id_rsa)

使用参数 -l 可以查看所有已添加的私钥

1
2
$ ssh-add -l
2048 SHA256:wz1hzL73oaXjmGmhuJmu4wSadjbQ7FXqSlnvVFrAKAo /c/Users/ljx0832/.ssh/xxserver/id_rsa (RSA)

使用参数 -d 可以删除某个私钥,参数 -D 可以删除所有私钥

1
2
3
4
$ ssh-add -d ~/.ssh/xxserver/id_rsa
Identity removed: /c/Users/ljx0832/.ssh/xxserver/id_rsa (ljx0832@175)
$ ssh-add -l
The agent has no identities.

添加私钥生效之后,再进行远程登录就不用输入密码了

1
2
3
4
5
6
7
8
$ ssh-agent bash
$ ssh-add ~/.ssh/xxserver/id_rsa
Identity added: /c/Users/ljx0832/.ssh/xxserver/id_rsa (/c/Users/ljx0832/.ssh/xxserver/id_rsa)
$ ssh root@xxx.xx.xx.xx
Last failed login: Wed May 30 03:44:01 UTC 2018 from xxx.xx.xx.xx on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed May 30 03:25:43 2018 from xxx.xx.xx.xx
[root@vultr ~]#

每次打开 SSH Client 的时候都得先手动启动 ssh-agent 再使用 ssh-add 添加私钥生效,之后才能使用公钥登录进行远程登录,虽然比口令登录少了输入密码这个步骤,却多了好几个步骤,感觉反而更不便捷了。解决的方法是启动终端的时候自动启动 ssh-agent 并自动添加相应的私钥生效。如果使用的 SSH Client 是 Github 客户端,则不需要做什么,Github 客户端启动的时候会自动 ssh-agent;如果是其它终端,则要运行相应的脚本来自动启动 ssh-agent。比如我使用的是 Git bash,则新建一个文件 ~/.bashrc~/.profile,把下面的内容复制进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
#ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
#ssh-add
fi

unset env

#ssh-add 这里写你要添加的私钥,比如我在 ~/.ssh/ 下有 5 个密钥,则 #ssh-add 这里进行下面的替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add ~/.ssh/github/id_rsa
ssh-add ~/.ssh/gitlab/id_rsa
ssh-add ~/.ssh/oschina/id_rsa
ssh-add ~/.ssh/csdn/id_rsa
ssh-add ~/.ssh/xxserver/id_rsa
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add ~/.ssh/github/id_rsa
ssh-add ~/.ssh/gitlab/id_rsa
ssh-add ~/.ssh/oschina/id_rsa
ssh-add ~/.ssh/csdn/id_rsa
ssh-add ~/.ssh/xxserver/id_rsa
fi

保存之后重新打开 Git bash,会有下面的提示,表示 ssh-agent 已经自动启动,并自动添加了我的 5 个密钥

1
2
3
4
5
Identity added: /c/Users/ljx0832/.ssh/github/id_rsa (/c/Users/ljx0832/.ssh/github/id_rsa)
Identity added: /c/Users/ljx0832/.ssh/gitlab/id_rsa (/c/Users/ljx0832/.ssh/gitlab/id_rsa)
Identity added: /c/Users/ljx0832/.ssh/oschina/id_rsa (/c/Users/ljx0832/.ssh/oschina/id_rsa)
Identity added: /c/Users/ljx0832/.ssh/csdn/id_rsa (/c/Users/ljx0832/.ssh/csdn/id_rsa)
Identity added: /c/Users/ljx0832/.ssh/xxserver/id_rsa (/c/Users/ljx0832/.ssh/xxserver/id_rsa)

只有第一次启动 Git bash 的时候会有上面的提示,之后就算关掉终端,ssh-agent 还是运行的,直到电脑关机或者进程被杀死。所以之后打开终端不会再有任何提示,但此时密钥已经添加了,直接进行公钥登录即可。

1
2
3
4
5
$ ssh root@xxx.xx.xx.xx
Last failed login: Wed May 30 11:45:54 UTC 2018 from xxx.xx.xx.xx on ssh:notty
There were 300 failed login attempts since the last successful login.
Last login: Wed May 30 03:56:39 2018 from xxx.xx.xx.xx
[root@vultr ~]#

Github 官方文档:https://help.github.com/articles/working-with-ssh-key-passphrases/#auto-launching-ssh-agent-on-msysgit

Git 版本控制工具

连接方式

前面说过 SSH 连接的一个主要应用场景就是远程登录,还有一个重要应用场景就是 git 连接,git 有两种连接方式,传统的 https 连接和更加安全的 ssh 连接。下面是使用 https 连接 clone 仓库的命令

1
git clone https://gitee.com/linjinxin_scau/OpenGL_Light.git

克隆之后本地仓库自动关联了两个远程仓库地址

1
2
3
$ git remote -v
origin https://gitee.com/linjinxin_scau/OpenGL_Light.git (fetch)
origin https://gitee.com/linjinxin_scau/OpenGL_Light.git (push)

使用 ssh 连接 clone 仓库的命令

1
git clone git@gitee.com:linjinxin_scau/OpenGL_Light.git

同样克隆之后本地仓库自动关联了两个远程仓库地址

1
2
3
$ git remote -v
origin git@gitee.com:linjinxin_scau/OpenGL_Light.git (fetch)
origin git@gitee.com:linjinxin_scau/OpenGL_Light.git (push)
  • 使用 https 连接,每次 push 都必须输入用户名和密码,clone 项目(私有项目除外)和 pull 操作无需输入用户名和密码。
  • 使用 ssh 连接,只要把公钥放在远程主机(代码托管网站)上,且本地添加了私钥生效,接下来任何 git 操作都无需输入密码。

这两种连接方式,很明显 ssh 连接更好,一来 ssh 连接的安全性更有保障,二来使用 ssh 连接可省去输入密码的麻烦,当然是前提是要先生成密钥并配置好密钥环境。

生成密钥

既然推荐使用 ssh 连接,那就得先配置好 ssh 连接所需的密钥环境,首先使用命令生成一对公钥和私钥

1
ssh-keygen -t rsa -C "email" -f "~/.ssh/id_rsa"

-C 是对这个密钥的描述,会附加到公钥最后面,如果密钥用于登录远程主机,则这个说明一般会是我们的用户名,用以表明我们的身份;如果密钥用于 git 操作,则这个说明一般是我们的邮箱,也就是我们在代码托管网站上注册的账号,因为我们在 push/pull 的时候也是用的这个邮箱,所以用这个作说明更加明了。当然,这个说明仅是一个描述而已,使用户名和邮箱作说明只是一个规范,并不是强制要求,实际上这个说明是可以写任意东西的。这个命令前面已经介绍过了,关于更多请看 SSH 远程工具/公钥登录 章节。

生成之后把公钥拷到相应的代码托管网站上,直接找到这些网站的 settings/ssh keys 进行添加即可,然后生效本地的私钥,之后就能在不使用密码的情况下操作这个代码托管网站上的仓库(当然他人的私有项目除外)。

重新生成密钥

如果想要修改我们的密钥,直接使用上述的命令重新生成一个进行覆盖即可,然后再把新的公钥拷贝到代码托管网站上,把旧的公钥删掉。要注意的是,重新生效密钥之后,本地新的私钥并不会立即生效,因为 ssh-agent 已经启动并且使用添加了旧的私钥,所以现在生效的是旧的,即使这个旧的私钥文件已经被删除了。如果要使新私钥立即生效,就必须得重启 ssh-agent,使用下面命令即可杀死 ssh-agent 进程

1
ssh-agent -k

之后使用下面命令启动 ssh-agent

1
ssh-agent bash

再使用下面命令添加新的私钥生效

1
ssh-add ~/.ssh/id_rsa

上面这种重启 ssh-agent 和添加私钥生效的方法比较麻烦且只对当前终端生效,终端关闭之后 ssh-agent 也就关闭了。更好的方法是使用配置文件 ~/.bashrc~/.profile ,这样在启动 Git bash 的时候都会自动启动 ssh-agent 并自动添加私钥生效 ,且是永久生效的(直到电脑关机或进程被杀),具体看上面 SSH 远程工具/公钥登录/私钥生效 章节介绍。

clone 仓库

无论是哪种连接方式,我们都可以随意 clone 网上开源的项目,但如果是私有的项目,那我们只能 clone 自己的私有项目,那 git 是如何判断项目是不是我们自己的呢?

如果是 ssh 地址,则判断本地主机是否能与远程主机的某个地址(通过链接中的账号信息找到这个地址)建立连接,即密钥环境有没有配置好,如果没有配置好密钥环境,本地是无法正常连接远程的,ssh 会直接拒绝了服务

1
2
3
4
5
6
7
$ git clone git@gitee.com:linjinxin_scau/OpenGL_Light.git
Cloning into 'OpenGL_Light'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

这个例子会找到 linjinxin_scau 这个账号在 oschina 上的地址,然后就能找个这个地址上的公钥,匹配这个公钥和本地的私钥,发现不匹配所以无法 clone。

要注意的是,使用 ssh 连接,如果没有生成密钥或者本地私钥和远程公钥对不上或者没有使私钥生效,是无法进行任何操作的,不仅 clone 不了私有项目,连开源项目也 clone 不了。因为 ssh 会检查本地的私钥和远程主机(github、gitlab 等)的公钥是否匹配,不匹配是无法进行网络连接的,这也是 ssh 更加安全的地方。

如果是 https 地址,则判断提供的账号与项目的归属账号是否一致。在 clone 的时候会弹出一个输入框,让我们输入用户名和密码,如果我们关闭了弹出框,则会在 bash 终端再次提示输入用户名和密码

1
2
3
4
5
6
7
8
9
10
11
$ git clone https://gitee.com/linjinxin_scau/OpenGL_Light.git
Cloning into 'OpenGL_Light'...
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://gitee.com/': linjinxin_scau@126.com
error: unable to read askpass response from 'E:/Program Filles/Git/mingw64/libexec/git-core/git-gui--askpass'
Password for 'https://linjinxin_scau@126.com@gitee.com/':
remote: Counting objects: 346, done.
remote: Compressing objects: 100% (286/286), done.
Rremote: Total 346 (delta 87), reused 273 (delta 54)
Receiving objects: 100% (346/346), 250.89 KiB | 0 bytes/s, done.
Resolving deltas: 100% (87/87), done.

有时候,你会发现使用 https 连接操作私有项目时并不需要输入用户名和密码,那是因为你在这台电脑上输入过密码,且被电脑记录下来了。在 控制面板-->用户账户-->管理你的凭据-->Windows凭据 可以看到你的 git 账户和密码。把这个账户信息删掉,再操作私有项目就会提示你输入用户名和密码了。

总结一下,

  • 对于 ssh 连接,无论是开源项目还是自己的私有项目,都需要配置好密钥环境才能 clone,不需要输入用户名和密码。
  • 对于 https 连接,开源项目直接 clone,自己的私有项目需要输入正确用户名和密码才能 clone。
  • 对于别人的私有项目,不能 clone。

注意,上面讲的用户名其实是指邮箱地址,因为 git 远程仓库账号的唯一凭据都是邮箱地址而不是用户名或者其它。

本地配置

为什么

使用 https 连接,每次 push 的时候都会要求输入用户名和密码,无论是开源项目还有私有项目;而 ssh 连接 push 的时候则不需要,那它使用的用户名从哪读来的呢?答案是不需要用户名,有密钥足以。密钥里面虽然没有包含我们的账户信息,但使用 ssh 连接本身就是为了跳过账号的,即使用 ssh 连接是不需要 git 账号的。为什么不需要提供账号,因为远程仓库地址中包含了账号地址,然后平台通过这个账号地址就能找到账号的信息,当然也能找到这个账号在平台上面的公钥,公钥和私钥都有了,自然就能进行通信了,还要账号干嘛。

1
2
3
4
$ git remote -v
origin git@gitee.com:linjinxin_scau/AStar.git (fetch)
origin git@gitee.com:linjinxin_scau/AStar.git (push)
$ git push

从远程地址 `git@gitee.com:linjinxin_scau/AStar.git中可以知道仓库AStar是账号linjinxin_scau所有,所以在进行git push的时候会向oschina:linjinxin进行请求,这个过程会进行相关的密钥操作。具体的操作不清楚,但我个人猜测应该是跟远程登录是一样的,即本地向远程请求push` 操作,远程发一串随机字符串下来,本地使用私钥加密之后发送到远程,远程使用记录的公钥进行解密,解密之后的字符串与源字符串一致则认为用户可信,这时候就允许本地向远程推送东西了。

这时候可能会有个疑问,不需要验证账号会不会不安全啊?肯定不会,事实上 ssh 更安全,因为它传输的任何数据都是通过私钥加密的,即使被拦截也不会被破译。而一台主机能够使用 ssh 来连接 git 远程,则说明这台主机的主人已经拷贝了一份公钥到远程地址了,能在远程地址添加公钥,则说明这个人能使用账号密码直接登录远程地址,如果这个人不是账号拥有者的话,那说明这个账号已经被盗了,这时候还说什么安全不安全的,这完全不是 ssh 的锅啊。

可以得出这样一个结论,无论是哪种连接方式,都不需要在本地配置任何账号信息的,https 连接会在 push 的时候要求输入用户名(也就是邮箱)和密码,而 ssh 直接通过密钥解决了,不需要账号验证。事实上,还是需要在本地配置 git 账号的,这个账号不是用在 pushclone 的时候,而是用在 commit 的时候。如果本地 git 没有配置账号,则执行 commit 操作的时候会报下面错误

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git commit -m "for test"

*** Please tell me who you are.

Run

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'ljx0832@ljx0832-PC.(none)')

我们看提示信息的第一句,“请告诉我你是谁”,也就是说 git 不允许一个身份不明的人进行提交修改,即使我们拥有合法的对项目的操作权,但仍必须表明身份,因为这个身份信息会记录在提交记录中,如果不表明身份,那这一条提交记录就不知道是谁的。要知道到 commit 这一步的时候还不需要任何账号验证,用户名密码验证或密钥验证,所以 commit 信息里没包含任何有关提交者的信息;也许有人会说在 commit comment 里面说明啊,这样做是可以,但很不专业也很不规范,很多人可以选择不表明身份,即使表明了,别人还得去一串长长的说明里面去寻找你的身份信息,这绝对不是团队协作需要的;也许还会有人说 push 的时候不是有账号信息吗,把这个账号信息写进去不就行了,但要知道 commit 信息是在 push 之前就已经生成好了,在 push 之后再回过头去修改这个信息,这种操作是反常的,git 也不愿意做。

所以,在 commit 之前要配置好账号信息,包括邮箱地址和姓名。commit 时优先检查邮箱地址是否合法,如果邮箱地址没配置的话,git 会自动检测一个,检测的结果就是 电脑用户名@电脑名,如果这个结果是个合法的邮箱地址,那 git 就以这个地址作为我们的邮箱凭证。这里的合法地址并不一定是真实注册的邮箱地址,只要符合邮箱地址的形式即可,即 name@host,所以如果我们的电脑名是一个域名,那检测的结果应该是可用的,但即便如此还是配置我们真正使用的邮箱才能真正表明我们的身份。从最后的提示 got 'ljx0832@ljx0832-PC.(none) 可以看出,git 自动检测的结果不是一个合法的邮箱地址,所以 commit 的时候报错了。

现在先把邮箱地址设置好了,再找执行 commit 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git config user.email "lin@126.com"
$ git commit -m "test"

*** Please tell me who you are.

Run

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <lin@126.com>) not allowed

可以看到还是提示说不知道我的身份,但这回是不知道我的名字,并没有提示邮箱不存在,即便我配置的邮箱地址是随便写的。所以,commit 的时候会先检查邮箱地址,再检查名字,两者缺一不可。我们可以在 commit log 中看到每条记录的作者名和邮箱地址。

1
2
3
4
5
6
$ git log
commit d79f5676af723bdf615053be6631cb275cbd785f (HEAD -> master, origin/master, origin/HEAD)
Author: washimanong <lin@126.com>
Date: Fri Jun 1 01:16:51 2018 +0800

for test

怎么做

上面的报错提示已经清晰地说明要怎么配置账号信息,事实上 git config 除了配置账号信息之外还可以配置很多东西,具体的看网上的 git 教程吧。git config 配置的东西是永久的,这说明这些配置是保存在文件中的,至于要保存在哪里,就得先知道 git config 的三种等级,分别是 System Config, Global Config, Local Config

  • 系统配置,就是对这台电脑上所有用户的所有仓库都生效,这些配置保存在 $(git path)/etc/gitconfig$(git path)/mingw64/etc/gitconfig 中,如果要读取或修改系统配置,则使用 --system 参数
  • 全局配置,也叫用户配置,就是对这台电脑的当前用户的所有仓库生效,这些配置保存在 ~/.gitconfig~/.config/git/confg 中,如果要读取或修改全局配置,则使用 --global 参数
  • 局部配置,就是只对当前仓库生效的配置,保存在 $(repository)/.git/config 中,如果要读取或修改局部配置,使用 --local 或省略不写,默认就是对局部生效,注意要进入在仓库里面才能操作

这三种配置的作用范围是 系统配置>全局配置>局部配置,但生效的时候是范围小的优先生效,即局部配置存在则使用局部配置,否则全局配置存在就使用全局配置,最后才考虑使用系统配置。

git config 还有很多参数,比如 --get 用于查看某个配置项的值,--unset 用于删掉某个配置项,更多的参数通过 -h 查看或查阅网上资料。

多账号配置

这里说的多账号是指同时对不同代码托管网站的仓库进行贡献,比如我们可能会在同一台电脑上处理 github 上面的项目,gitlab 上面的项目,oschina 上面的项目和 csdn 上面的项目,在这些网站上注册的账号可能不一致,所以就涉及到多账号了。有两件事要做,commit 时需要的账号信息和 push 时需要验证的密钥。

对账号信息的处理非常简单,涉及到多账号就使用局部配置呗,每初始化或克隆一个项目,就为这个项目单独配置一个邮箱和用户名字。当然,也可以结合全局配置一起使用,即把一个其中托管网站的账号作为全局配置,之后这个网站上的仓库就不需要单独配置局部账号了,比如我在 github 上注册的邮箱是 `linjinxin_scau@126.com`,则可以

1
2
3
4
5
6
7
$ git config --global user.email "linjinxin_scau@126.com"
$ git config --global user.name "linjinxin"
$ cat ~/.gitconfig
[user]
[user]
email = linjinxin_scau@126.com
name = linjinxin

对密钥的处理也可以很简单,可以只生成一对密钥,然后把这个公钥拷贝到所有的代码托管网站上,之后只需要生效这一个私钥就能访问所有的代码托管网站。当然,如果你想为每一个网站都生效一对密钥也是可以的,只是会复杂一点。

首先这些密钥要找到合适的地方放,可以修改密钥的命名(密钥不一定得叫 id_rsa 的),或者在 ~/.ssh 目录建个目录存放,我采用的是后者,比如用于访问 github 的私钥文件名为 ~/.ssh/github/id_rsa,访问 gitlab 的叫 ~/.ssh/gitlab/id_rsa

然后,访问哪个网站就得使相应的那个私钥生效,比如要访问 github 的某个仓库,则

1
2
3
$ ssh-agent bash
$ ssh-add ~/.ssh/github/id_rsa
Identity added: /c/Users/ljx0832/.ssh/github/id_rsa (/c/Users/ljx0832/.ssh/github/id_rsa)

可以使用 ssh 命令来检测是否能正常连接到远程嗠器

1
2
$ ssh -T git@github.com
Hi linjinxin! You've successfully authenticated, but GitHub does not provide shell access.

输出上面的信息就表明可以正常连接 github 服务器了,这里测试的地址是 git@合法域名git@ip 地址。当然另一种方式是上面讲过很多次的 ~/.bashrc~/.profile 脚本来自动启动 ssh-agent 并添加所有私钥生效,这种方式的好处就量方便,当然有时候我们可能并不想使所有的密钥都生效,只需要修改脚本删掉不想生效的密钥,或者不使用脚本,手动来添加生效。

轮流检测

有时候在执行 ssh 命令的时候会出现下面这个错误信息

1
2
3
$ ssh -T git@192.168.0.166
Received disconnect from 192.168.0.166 port 22:2: Too many authentication failures for git
Connection to 192.168.0.166 closed by remote host.

从提示得知不能连接的原因是太多次验证失败,too many authentication failures,这是因为 ssh 为了安全,如果一个主机在一次连接里使用多个密钥进行尝试匹配,失败次数达到一个阈值时就不允许再连接了,直接 disconnect 掉,目的是防止暴力暴力破解。问题是我好像没有尝试使用多个密钥去匹配啊,其实是有的,因为我现在电脑上已经有五六个密钥了,当我连接 github 的时候 ssh 并不知道要使用哪个密钥,所以只能每个密钥都去匹配一次,暂时称之为轮流检测。有什么证据可以说明 ssh 拿每个密钥都去尝试了呢,加上 -v 参数,ssh 会详细的请求连接过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$ ssh -T git@192.168.0.166 -v
OpenSSH_7.3p1, OpenSSL 1.0.2k 26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Connecting to 192.168.0.166 [192.168.0.166] port 22.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /c/Users/ljx0832/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.3
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5* compat 0x0c000000
debug1: Authenticating to 192.168.0.166:22 as 'git'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: diffie-hellman-group-exchange-sha256
debug1: kex: host key algorithm: ssh-rsa
debug1: kex: server->client cipher: aes128-ctr MAC: umac-64@openssh.com compress ion: none
debug1: kex: client->server cipher: aes128-ctr MAC: umac-64@openssh.com compress ion: none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(2048<3072<8192) sent
debug1: got SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: got SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: ssh-rsa SHA256:kR3uzR6d/Q7eKlbrkIYdFCA3cEHzP1wmX7bNp9g1 cmc
debug1: Host '192.168.0.166' is known and matches the RSA host key.
debug1: Found key in /c/Users/ljx0832/.ssh/known_hosts:9
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi c
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /c/Users/ljx0832/.ssh/github/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi c
debug1: Offering RSA public key: /c/Users/ljx0832/.ssh/gitlab/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi c
debug1: Offering RSA public key: /c/Users/ljx0832/.ssh/oschina/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi c
debug1: Offering RSA public key: /c/Users/ljx0832/.ssh/csdn/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi c
debug1: Offering RSA public key: /c/Users/ljx0832/.ssh/xxserver/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mi c
debug1: Offering RSA public key: /c/Users/ljx0832/.ssh/q2server/id_rsa
Received disconnect from 192.168.0.166 port 22:2: Too many authentication failur es for git
debug1: Authentication succeeded (publickey).
Authenticated to 192.168.0.166 ([192.168.0.166]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: channel 0: free: client-session, nchannels 1
Connection to 192.168.0.166 closed by remote host.
Transferred: sent 4208, received 2704 bytes, in 0.0 seconds
debug1: Exit status -1

log 非常长,但也很容易看懂,在开始处有很多条 key_load_public: No such file or directory 信息,这里并不是报错,只是正常的信息。ssh 只是想鉴定有没有默认的公钥而已,即 ~/.ssh/id_rsa, ~/.ssh/id_rsa-cert, ~/.ssh/id_dsa 等等这些公钥文件是否存在,这里不同的公钥文件对应不同的加密方式,我们常用的是 rsa 加密,所以默认的文件名是 id_rsa。这些默认文件不存在并不会影响连接,所以直接忽略就行。接下来 host key algorithm: ssh-rsa 由加密算法得出加密方式是 ssh-rsa,并且和远程对应上了 Host '192.168.0.166' is known and matches the RSA host key.。接下来就是轮流去检测 ~/.ssh 目录下的所有 rsa 私钥,发现检测到最后一个的时候是已经验证成功了 Authentication succeeded (publickey).。但接下来一个很不幸的消息,连接被关闭了,就因为检测次数太多了 Connection to 192.168.0.166 closed by remote host.

开发篇

游戏篇

配置 OpenGL 开发环境

OpenGL是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口。它是一个底层图形库,不是引擎,也不是上层接口,它不负责窗口创建和管理,只负责底层的图形渲染。因此,开发 OpenGL 还需要其它许多库的支持。

现代的 Windows 操作系统都自带 OpenGL 库,所以很多用 OpenGL 开发的程序或游戏都可以在我们的电脑上正常运行(当然有些程序为了保险起见也会在安装包中加上运行库)。

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib

  • 32 位程序 || 64 位程序
  • Debug || Release
  • 动态链接库 || 静态链接库